|
有時在我們自己開發的軟件中需要調用系統中已安裝的其他應用程序,比如支持自定義的鎖屏,或是自己開發的桌面Launcher。
網上能夠搜索到一種方法是利用packageManager的getLaunchIntentForPackage方法,這種方法無需應用程序啟動Activity的類名,只需要傳遞應用程序的包名,即可返回一個intent,在這裡提供一些簡單的代碼來描述其實現步驟:
1、通過PackageManager從系統中獲得所有已安裝的應用程序信息
PackageManager pm = context.getPackageManager();
List<ApplicationInfo> listAppInfo = pm.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
2、遍歷所有應用,提取包名並調用getLaunchIntentForPackage方法得到intent
for (ApplicationInfo app : mListAppcations) {
Intent i = pm.getLaunchIntentForPackage(app.packageName);
}
3、獲得的intent即可直接用於調用該應用程序了
startActivity(i);
- -------------------------------------------------- --------------------------------分割線---------------- ----------------------------------------
在實踐中我發現,採用前述方法有時返回的intent為null,並不能完全實現應用間的調用,原因應該是該包沒有main activity,從而找不到入口,解決方法是修改應用的androidmanifest.xml,在主Activity中添加
<action android:name ="android.intent.action.MAIN" />。很明顯這不不是我想要的解決方法。
通過查找資料,我發現了另一種方案。這個方法的原理是,調用PackageManager的queryIntentActivities方法獲得應用程序默認啟動的Activity的相關信息(包括類名),從而實現應用程序間的調用,代碼如下:
1、這裡還是用getLaunchIntentForPackage首先嘗試獲得intent
- Intent i = pm.getLaunchIntentForPackage(app.packageName);
- //如果返回的intent為空
- if(i==null){
- //findActivitiesForPackage是備選方案,當getLaunchIntentForPackage沒有正確得到intent時
- ResolveInfo r = findActivitiesForPackage(pm,app.packageName);
- if(r!=null){
- i = new Intent();
- i.se
複製代碼
tComponent(new ComponentName(app.packageName,r.activityInfo.name));
}
}
2、findActivitiesForPackage的代碼:
- private static ResolveInfo findActivitiesForPackage(PackageManager packageManager,
- String packageName) {
- final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
- boolean isfinded = false;
- //通過CATEGORY_DEFAULT參數查找應用程序默認的Activity
- //為什麼不是CATEGORY_MAIN參數,原因上面已經說了
- mainIntent.addCategory(Intent.CATEGORY_DEFAULT);
- final List<ResolveInfo> apps = packageManager.queryIntentActivities(mainIntent, 0);
- ResolveInfo info = null;
- if (apps != null) {
- // Find all activities that match the packageName
- int count = apps.size();
- for (int i = 0; i < count; i++) {
- info = apps.get(i);
- final ActivityInfo activityInfo = info.activityInfo;
- if (packageName.equals(activityInfo.packageName)) {
- isfinded = true;
- break;//只要一個
- }
- }
- }
- if(!isfinded){
- return null;
- }
- return info;
- }
複製代碼
3.getLaunchIntentForPackage的代碼:
- PackageManager pm = getPackageManager();
- Intent myIntent = pm.getLaunchIntentForPackage(package_name);
- if (myIntent != null) {
- startActivity(myIntent);
- }
複製代碼
小結:第一種方法代碼簡單,且支持大多數第三方應用的調用,第二種方案可以作為一種補充,第三種最為簡易
|
|