Intent分为显示和隐式
一个intent filter拥有1个或以上的acton和category。android系统默认每个组件都有
效果如图:
显示Intent:通过指定组件的名称来调用,通常用于同一个应用程序的内部组件的启动
隐式Intent:不通过指定组件的名称调用,通常用action和categroy过滤,这种方法往往用于启动其他应用的组件,同时也可以减少代码的耦合度
一个没有intent filters的组件只能收到显式调用,有intent filters的2种调用都能收到。intent filter通常在清单文件中设置。
<activity
android:name=".Activity1"
android:label="@string/app_name" >
<intent-filter>
<action android:name="test.intent.activity1" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
一个intent filter拥有1个或以上的acton和category。android系统默认每个组件都有
android.intent.category.DEFAULT
这个category,如果不设置的话通过intent启动这个组件时会报android.content.ActivityNotFoundException: No Activity found to handle Intent的错误。
以上的activity可以通过以下代码启动:
Intent intent = new Intent();
intent.setAction("test.intent.activity1");
startActivity(intent);
Activity2:
<activity
android:name=".Activity2"
android:label="@string/app_name" >
<intent-filter>
<action android:name="test.intent.activity2" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="test.intent.activity2" />
<category android:name="test.intent.activity2_1" />
</intent-filter>
</activity>
可以通过以下代码启动:
Intent intent = new Intent();
intent.setAction("test.intent.activity2");
intent.addCategory("test.intent.activity2");
startActivity(intent);
ps:比较常用的,返回home界面的代码:
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_HOME);
startActivity(intent);
如果不希望使用默认的home界面,可以自己修改,使得想要的activity成为home界面
<activity
android:name=".Activity2"
android:label="@string/app_name" >
<intent-filter>
<action android:name="test.intent.activity2" />
<category android:name="android.intent.category.HOME" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
PackageManager是一个很重要的类,可以利用它根据一些条件过滤intent,以启动符合条件的组件。
下面的代码找出所有应用程序的初始启动activtiy
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
PackageManager pm = getPackageManager();
List<ResolveInfo> list = pm.queryIntentActivities(intent, 0);
for (ResolveInfo i:list) {
Log.v("test", i.toString());
String packageName = i.activityInfo.packageName;
String className = i.activityInfo.name;
Log.v("test", packageName+"."+className);
}
效果如图: