Intent寻找目标组件的两种方式:
- 显式Intent:通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。
- 隐式Intent:通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。
一.显式Intent
一 般情况下,一个Android应用程序中需要多个屏幕,即是多个Activity类,并且在这些Activity之间进行切换通过Intent机制来实现 的。在同一个应用程序中切换Activity时,我们通常都知道要启动的Activity具体是哪一个,因此常用显式的Intent来实现的。
下 面的例子是在同一应用程序中MainActivity启动SecondActivity,下面的代码中,主要是为“转到SecondActivity”按 钮添加了OnClickListener,使得按钮被点击时执行onClick()方法,onClick()方法中则利用了Intent机制,来启动 SecondActivity,关键的代码是22~25行。
main.xml
1 27 12 18
second.xml
1 27 12 18
MainActivity.java
1 package com.android.test.activity; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 private Button btn; 12 @Override 13 public void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.main); 16 17 btn = (Button)findViewById(R.id.btn); 18 //响应按钮btn事件 19 btn.setOnClickListener(new OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 //显示方式声明Intent,直接启动SecondActivity 23 Intent it = new Intent(MainActivity.this,SecondActivity.class); 24 //启动Activity 25 startActivity(it); 26 } 27 }); 28 } 29 }
SecondActivity.java
1 package com.android.test.activity; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 10 public class SecondActivity extends Activity { 11 private Button secondBtn; 12 @Override 13 protected void onCreate(Bundle savedInstanceState) { 14 super.onCreate(savedInstanceState); 15 setContentView(R.layout.second); 16 17 secondBtn=(Button)findViewById(R.id.secondBtn); 18 //响应按钮secondBtn事件 19 secondBtn.setOnClickListener(new OnClickListener() { 20 @Override 21 public void onClick(View v) { 22 //显示方式声明Intent,直接启动MainActivity 23 Intent intent = new Intent(SecondActivity.this,MainActivity.class); 24 //启动Activity 25 startActivity(intent); 26 } 27 }); 28 } 29 }
AndroidManifest.xml清单文件,16~18行为SecondActivity在清单文件里的声明
1 26 7 8 9 2011 1612 1513 14 18 19
效果图:
二.隐式Intent
下面是同一应用程序中的Activity切换的例子,需要AndroidManifest.xml中增加Activity的声明,并设置对应的Intent Filter和Action,才能被Android的应用程序框架所匹配。
MainActivity.java
1 package com.android.change.activity; 2 3 import android.app.Activity; 4 import android.content.Intent; 5 import android.os.Bundle; 6 import android.view.View; 7 import android.view.View.OnClickListener; 8 import android.widget.Button; 9 10 public class MainActivity extends Activity { 11 private Button btn; 12 13 @Override 14 public void onCreate(Bundle savedInstanceState) { 15 super.onCreate(savedInstanceState); 16 setContentView(R.layout.main); 17 18 btn = (Button) findViewById(R.id.btn); 19 // 响应按钮btn事件 20 btn.setOnClickListener(new OnClickListener() { 21 @Override 22 public void onClick(View v) { 23 // 实例化Intent 24 Intent it = new Intent(); 25 //设置Intent的Action属性 26 it.setAction("com.android.activity.MY_ACTION"); 27 // 启动Activity 28 startActivity(it); 29 } 30 }); 31 } 32 }
SecondActivity.java
1 package com.android.change.activity; 2 3 import android.app.Activity; 4 import android.os.Bundle; 5 6 public class SecondActivity extends Activity { 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.second); 12 } 13 }
main.xml
1 27 11 17
seond.xml
1 27 12
AndroidManifest.xml 文件的18,19行修改了Intent Filter,这样SecondActivity才能够接收到MainActivity发送的Intent。因为在MainActivity的 Intent发送的动作为"com.android.activity.MY_ACTION",而在18行里,SecondActivity设置的 Action也为"com.android.activity.MY_ACTION",这样就能进行匹配。
1 26 7 8 9 2311 1612 1513 14 17 2218 2119 20
效果图:
对 于显示Intent,Android不需要再去做解析,因为目标组件很明确。Android需要解析的是隐式Intent,通过解析,将Intent映射 给可以处理该Intent的Activity,Service等。Intent的解析机制主要是通过查找已经注册在 AndroidManifest.xml中的所有IntentFilter以及其中定义的Intent,最终找到匹配的Intent。
本文出自 “” 博客,请务必保留此出处