通過 PackageManager 獲得你想要的 App 信息

PackageManager

介紹

有些場景下,我們會需要獲取一些其它 App 的各項信息,例如:App 名稱,包名、Icon 等。這個時候就需要使用到 PackageManager 這個類了

你首先需要獲取 PackageManager(以下簡稱 PM) 對象,通過 PM 對象,你就可以獲取到你需要的各項 App 的信息類

這裏涉及到的 App 信息類包括:PackageInfo、ApplicationInfo、ActivityInfo/ServiceInfo/ProviderInfo 等,還有一個 ResolveInfo 類,它比較特殊一點,不和前面的結構爲從屬關係

這些類,都可以在根據 AndroidManifest.xml 中定義的組件進行劃分,大概的結構如下
在這裏插入圖片描述

獲取

在 Context 中,就有獲取 PM 對象的方法,getPackageManager(),所以四大組件想要獲取它是非常簡單的

PM 中,提供了非常多的方法,供我們通過不同的條件,獲取到 PackageInfo 對象、ApplicationInfo 對象等

PackageInfo

PackageInfo 從名稱上也可以看出來,它主要用於存儲獲取到的 Package 的一些信息,包括:包名(packageName)、版本號(versionCode)、版本名(versionName)

基本上拿到了 PackageInfo ,你就可以拿到大部分此 Apk 相關的信息了。並且,PackageInfo 中有一個 applicationInfo 的字段,是可以直接獲取到與它相關的 ApplicationInfo 對象的

這裏介紹幾個 PackageInfo 中,比較常用的字段:

  • packageName:包名
  • versionCode:版本號
  • versionName:版本名
  • firstInstallTime:首次安裝時間
  • lastUpdateTime:最後一次覆蓋安裝時間
PackageManager packageManager = getPackageManager();
        PackageInfo packageInfo = null;
        try {
            packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        int labelRes = packageInfo.applicationInfo.labelRes;
        String app_name = getResources().getString(labelRes);
        String packageName = packageInfo.packageName;
        int versionCode = packageInfo.versionCode;
        String versionName = packageInfo.versionName;
        long firstInstallTime = packageInfo.firstInstallTime;
        long lastUpdateTime = packageInfo.lastUpdateTime;
        textView.setText("appName:"+app_name+"\n"+"packageName:"+packageName+"\n " +
                        "versionCode:"+versionCode+"\n versionName:"+versionName+"\n firstInstallTime:"+
                date(firstInstallTime)+"\n lastUpdateTime:"+date(lastUpdateTime));

    private String date(long time){
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date date = new Date(time);
        return sdf.format(date);
    }

在這裏插入圖片描述

ApplicationInfo

ApplicationInfo 相對於 PackageInfo 用的會比較少一些。它主要用於獲取 Apk 定義在 AndroidManifest.xml 中的一些信息。這些信息是從AndroidManifest.xml的<application>標籤獲取的,ApplicationInfo對象裏保存的信息都是<application>標籤裏的屬性值

這裏介紹幾個比價常用的:

  • packageName:包名
  • targetSdkVersion:目標 SDK 版本
  • minSdkVersion:最小支持 SDK 版本,有 Api 限制,最低在 Api Level 24 及以上支持
  • sourceDir:App 的 Apk 源文件存放的目錄
  • dataDir:data 目錄的全路徑
  • metaData:Manifest 中定義的 meta 標籤數據
  • uid:當前 App 分配的 uid

獲取ApplicationInfo

我們可以獲取手機上安裝的所有程序對應的 ApplicationInfo,也可以獲得指定包名的ApplicationInfo,代碼如下:

/**
*獲取手機上安裝的所有的程序對應的 ApplicationInfo
* 它是通過解析AndroidManifest.xml的< application>標籤中得到的,所以它能得到所有的app
*/
List<ApplicationInfo> list = getPackageManager().getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);

/**
*獲取指定包名的 ApplicationInfo
*/
ApplicationInfo applicationInfo = getPackageManager().getApplicationInfo("com.xx.xx", 0);

通過ApplicationInfo來獲取應用程序的基本信息

//獲取應用圖標
Drawable drawable = applicationInfo.loadIcon(packageManager);

//獲取應用程序的 包名
String appPackageName = applicationInfo.packageName;

//獲取應用名
//參數 packageManager  是應用管理者對象 
String appName =applicationInfo.loadLabel(packageManager).toString();
<meta-data
	android:name="app_name"
	android:value="彈窗Demo" />

//<application/>標籤下metadata獲取
ApplicationInfo applicationInfo = packageManager.getApplicationInfo(packageName, PackageManager.GET_META_DATA);
Bundle metadata = applicationInfo.metaData;//然後通過改bundle獲取相應值
metadata.getString("app_name);

ActivityInfo

ActivityInfo、ServiceInfo、ProviderInfo 這三個是平級的,熟悉的一眼就能看出來,它們就是 Android 定義的四大組件中的幾個。各自涵蓋了一部分信息。一般在外部獲取其他 App 的信息的時候,不會獲取到這麼細緻的數據,如果有,看看這幾個類準沒錯

參考:
通過 PackageManager 獲得你想要的 App 信息

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章