Android隨筆之——Activity中啟動另一應用


  最近在寫語音交互程序,在語音打開應用這塊碰到如何用代碼控制應用啟動的問題。百度了一下,有兩種方案:1、獲取應用的包名;2、獲取應用的包名、入口類名。

  之前對兩種方案都進行了嘗試,發現方案二中存在一個弊端,那就是系統級應用只能獲取到包名,不能獲取到入口類名,這會導致程序報錯,當然你也可以不獲取系統級應用的包名和入口類名。出於簡單方便的考慮,選擇了方案一,廢話不多說,上代碼。

方案一、

1、獲取程序包名:

 1      // 獲取PackageManager對象
 2         PackageManager packageManager = getPackageManager();
 3         // 得到系統安裝的所有程序的PackageInfo對象
 4         List<PackageInfo> packages = packageManager.getInstalledPackages(0);
 5         // 創建String類型的數組,用來存放獲取的包名
 6         ArrayList<String> packageList = new ArrayList<String>();
 7 
 8         for (int i = 0; i < packages.size(); i++) {
 9             PackageInfo packageInfo = packages.get(i);
10 
11             // 判斷是否是系統級應用
12             if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
13                 packageList.add(packageInfo.packageName);
14             }
15         }

 

2、根據獲取的包名啟動應用:

 1      // 獲取PackageManager對象
 2         PackageManager packageManager = getPackageManager();
 3         // 獲取索引為i的包名
 4         String packageName = packageList.get(i);
 5         // 如果該程序不可啟動(像系統自帶的包,有很多是沒有入口的)會返回NULL
 6         Intent intent = packageManager.getLaunchIntentForPackage(packageName);
 7 
 8         if (intent != null) {
 9             startActivity(intent);
10         }

 

方案二、還沒仔細研究過,不過對那些主入口設置<intent-filter>的應用,方案二應該會優於方案一

1、獲取包名、主類名:

 1      // 獲取PackageManager對象
 2         PackageManager packageManager = context.getPackageManager();
 3         
 4         Intent intent = new Intent(Intent.ACTION_MAIN);
 5         intent.addCategory(Intent.CATEGORY_LAUNCHER);
 6 
 7         // 通過查詢,獲得所有ResolveInfo對象.
 8         List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(
 9                 intent, 0);
10         // 調用系統排序 , 根據name排序
11         // 該排序很重要,否則只能顯示系統應用,而不能列出第三方應用程序
12         Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(
13                 packageManager));
14 
15         for (ResolveInfo reInfo : resolveInfos) {
16             String activityName = reInfo.activityInfo.name; // 獲得該應用程序的啟動Activity的name
17             String pkgName = reInfo.activityInfo.packageName; // 獲得應用程序的包名
18             
19             System.out.println("activityName---" + activityName + " pkgName---"
20                     + pkgName);
21         }

2、啟動應用:

1 Intent intent = new Intent(Intent.ACTION_MAIN);
2 intent.addCategory(Intent.CATEGORY_LAUNCHER);
3 
4 ComponentName cn = new ComponentName(packageName,className);
5 
6 intent.setComponent(cn);
7 context.startActivity(intent);

 

作者:登天路

轉載請說明出處:http://www.cnblogs.com/travellife/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM