1. 程式人生 > >android接入第三方apk的解決方法

android接入第三方apk的解決方法

在實際的專案開發中經常會碰到想把第三方的apk程式直接整合進我們自己的應用中這樣的情況。

如果是自己編寫的兩個應用,那麼因為已經知道了這兩個應用的包名,所以我們很容易就能控制這兩個程式之間的跳轉問題。現在的問題是,其中的一個應用我們只有其apk。解決的思路其實一樣,可以想辦法獲取到它的包名,這樣就可以用同樣的方法進行跳轉。

分以下幾種情況進行討論

一、該應用已經安裝

這裡介紹兩種方法:

1、列舉所有安裝的應用

根據設定的條件進行篩選,使用PackageManager的public abstract List getInstalledPackages (int flags) 方法可以獲得安裝應用的列表。

用這個方法po主實現了一個類似檔案管理器的應用,可以獲取測試機上所有已裝的程式並啟動,獲取的分別為應用程式名稱,應用程式包名,應用程式入口Activity名稱。

當獲取了應用程式包名,應用程式入口Activity名稱就可以進行跳轉:


   // 啟動程式碼:
   PackageManager pm;  

   // 初始化pm, 比如在activity裡可以PackageManager pm = getPackageManager(); 
   // PackageInfo 包含豐富的包的資訊,這個'包的名稱'是什麼,在AndroidManifest.xml中有明確定義
   PackageInfo pi = pm.getPackageInfo("包的名稱"
, PackageManager.GET_ACTIVITIES); ActivityInfo ai=pi.activities[0]; // ActivityInfo同樣道理是Activity的資訊 //這裡指向第一個包中的Activity, 大多數都是第一個Activity為啟動Activity if(ai==null) throw new Exception(pkg+"不包含任何Activity"); String sName=ai.name; String pkg = ai.packageName; // pck: 應用的包名 // sName: 應用程式入口Activity名稱
ComponentName componet = new ComponentName(pkg, sName); Intent intent = new Intent(); intent.setComponent(componet); startActivity(intent);

趁這個機會總結了一下Info系列的類

PackageItemInfo:包含了一些資訊的基類,它的直接子類有:ApplicationInfo、ComponentInfo、InstrumentationInfo、PermissionGroupInfo、PermissionInfo。它的間接子類有:ActivityInfo、ProviderInfo、ServiceInfo。這個類包含的資訊對於所有包中專案是平等的。這些Package items是被Package manager所持有的。這個類提供了屬性的非常普通的基本設定:label、icon和meta-data。這個類的意圖不是被自己呼叫。它在這只是簡單地分享被package manager返回的所有items之間的普通定義。比如,它自己並不實現Parcelable介面,但卻幫助實現了Parcelable的子類提供了方便的方法。

ApplicationInfo是從一個特定的應用得到的資訊。這些資訊是從相對應的Androdimanifest.xml的標籤中收集到的。

ResolveInfo這個類是通過解析一個與IntentFilter相對應的intent得到的資訊。它部分地對應於從AndroidManifest.xml的標籤收集到的資訊。

PackageManager這個類是用來返回各種的關聯了當前已裝入裝置了的應用的包的資訊。你可以通過getPacageManager來得到這個類。

ApplicationInfo與ResolveInfo比較:前者能夠得到Icon、Label、meta-data、description。後者只能得到Icon、Label。

下面講一下這幾個類綜合在一起的具體應用:

通過呼叫PackageManager的方法可以得到兩種不同的資訊:

首先要得到manager:

PackageManager manager = getPackageManager();

method 1:

List appList = manager.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

它是通過解析AndroidManifest.xml的標籤中得到的,所以它能得到所有的app。

method 2:

Intent intent = new Intent(Intent.A CTION_MAIN,null);

intent.addCategory(Intent.CATEGORY_LAUNCHER);

List appList = manager.queryIntentActivities(intent,0);

它是通過解析標籤得到有

2、利用廣播的方式

 MyBroadcastReceiver myReceiver = new MyBroadcastReceiver();
        IntentFilter filter = new IntentFilter(Intent.ACTION_PACKAGE_INSTALL);
        filter.addAction(Intent.ACTION_PACKAGE_ADDED);
        filter.addDataScheme("package"); 
        registerReceiver(myReceiver, filter);

      監視安裝,在MyBroadcastReceiver的onReceive函式裡
      public void onReceive(Context arg0, Intent intent) {
                        String sPackageName=intent.getDataString();  //這個就是包名
                }

也可以使用 AndroidManifest.xml配置來監視。

二、該程式沒有被安裝

這個能否實現po主並沒有進行驗證,各位如果有這個需求可以參考下面這篇文章: