Android中如何正確的獲得所有App列表
阿新 • • 發佈:2019-01-05
我們經常會遇到這樣的需求:列出手機中所有能開啟的App。此時我們不需要列出那些無法開啟的app,也就是沒有Activity的。網上有一些方法,都是過濾系統app的方法,將簡訊、電話這些App都過濾掉了,其實只要使用下面程式碼就行了:
private void queryFilterAppInfo() {
PackageManager pm = this.getPackageManager();
// 查詢所有已經安裝的應用程式
List<ApplicationInfo> appInfos= pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);// GET_UNINSTALLED_PACKAGES代表已刪除,但還有安裝目錄的
List<ApplicationInfo> applicationInfos=new ArrayList<>();
// 建立一個類別為CATEGORY_LAUNCHER的該包名的Intent
Intent resolveIntent = new Intent(Intent.ACTION_MAIN, null);
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通過getPackageManager()的queryIntentActivities方法遍歷,得到所有能開啟的app的packageName
List<ResolveInfo> resolveinfoList = getPackageManager()
.queryIntentActivities(resolveIntent, 0);
Set<String> allowPackages=new HashSet();
for (ResolveInfo resolveInfo:resolveinfoList){
allowPackages.add(resolveInfo.activityInfo.packageName);
}
for (ApplicationInfo app:appInfos) {
// if((app.flags & ApplicationInfo.FLAG_SYSTEM) <= 0)//通過flag排除系統應用,會將電話、簡訊也排除掉
// {
// applicationInfos.add(app);
// }
// if(app.uid > 10000){//通過uid排除系統應用,在一些手機上效果不好
// applicationInfos.add(app);
// }
if (allowPackages.contains(app.packageName)){
applicationInfos.add(app);
}
}
mApplicationInfos=applicationInfos;
}