有时我们想查询具有某action、category的Activity属性,可以使用PackageManager通过指定的Intent获得ResolveInfo,然后再通过ResolveInfo获得想要的对应信息。
举个例子:
假设我想获得当前系统所有桌面应用的包名,则可以通过符合桌面应用的属性进行检索,代码示例如下:
private List<String> packageNameList = new ArrayList<String>();
private List getLauncherPackageName() {
PackageManager pm = this.getPackageManager();
//设置指定Intent,当前设置的是符合桌面应用设定的Activity,即:
// <action android:name="android.intent.action.MAIN" />
// <category android:name="android.intent.category.LAUNCHER" />
Intent intent = new Intent("android.intent.action.MAIN");
intent.addCategory("android.intent.category.LAUNCHER");
//queryIntentActivities()方法检索可以针对给定意图执行的所有活动并返回ResolveInfo。
//若第二个参数设置为PackageManager.MATCH_DEFAULT_ONLY,则只检索显示添加"android.intent.category.DEFAULT"属性的Activity
List<ResolveInfo> resolveInfos = pm.queryIntentActivities(intent,PackageManager.MATCH_ALL);
for (ResolveInfo info : resolveInfos) {
String pkgName = info.activityInfo.packageName;
Log.i(TAG, "getLauncherPackageName: pkgName = " + pkgName);
}
return packageNameList;
}
注意:若想把某一应用设置为home应用(即点击home键后不显示android默认界面而是启动此应用),需要应用主Activity添加属性
<category android:name="android.intent.category.HOME"/>
<category android:name="android.intent.category.DEFAULT"/>
,检索的时候指定intent则需要:
(1)当使用queryIntentActivities(intent,PackageManager.MATCH_ALL)时,未避免应用未显示设置default属性:
intent.addCategory("android.intent.category.HOME");
intent.addCategory("android.intent.category.DEFAULT");
(2)当使用queryIntentActivities(intent,PackageManager.MATCH_DEFAULT_ONLY)时只筛选home属性就行:
intent.addCategory("android.intent.category.HOME");
以上,个人实际使用经验,仅供分享学习。若有不足敬请备注指正。