显示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>
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>
下面的代码找出所有应用程序的初始启动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); }