安卓Intent(隐式)
相对于显式Intent(明确指出了目标组件名称的Intent),隐式Intent,没有明确指出目标组件名称。显式Intent直接用组件的名称定义目标组件,这种方式很直接。但是由于开发人员往往并不清楚别的应用程序的组件名称,因此,显式Intent更多用于在应用程序内部传递消息。比如在某应用程序内,一个Activity启动一个Service。而隐式Intent恰恰相反,它不会用组件名称定义需要激活的目标组件,它更广泛地用于在不同应用程序之间传递消息。在显式Intent消息中,决定目标组件的唯一要素就是组件名称,因此,如果Intent中已经明确定义了目标组件的名称,那么就完全不用再定义其他Intent内容。而对于隐式Intent则不同,由于没有明确的目标组件名称,所以必须由Android系统帮助应用程序寻找与Intent请求意图最匹配的组件。
隐式Intent指定一系列更为抽象的action和category等信息,然后交由系统去分析。通过<activity>标签下配置<intent-filter>的内容,可以制定当前活动能够相应的action和category。接上一篇文章,在AndroidManifest.xml中添加:
<activity android:name=".secondActivity"> <intent-filter> <action android:name="com.example.myintent.ACTION_START"/> <category android:name="android.intent.category.MY_CATEGORY"/> </intent-filter> </activity>
同时修改MainActivity中的代码:
1 public class MainActivity extends Activity { 2 3 private Button btn1; 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.activity_main); 9 10 btn1=(Button)findViewById(R.id.button1); 11 btn1.setOnClickListener(new OnClickListener() { 12 13 @Override 14 public void onClick(View arg0) { 15 // TODO Auto-generated method stub 16 //显式 17 // Intent intent=new Intent(MainActivity.this,secondActivity.class); 18 // startActivity(intent); 19 20 //隐式 21 Intent intent=new Intent("com.example.myintent.ACTION_START"); 22 intent.addCategory("android.intent.category.MY_CATEGORY"); 23 startActivity(intent); 24 } 25 }); 26 } 27 28 29 }
只有action和category同时匹配才能相应,一个Intent只能有一个action,但却可以有多个category。当在<intet-filter>中没有添加category时,系统不会报错,将会使用默认的一个category。