天天看點

Android 擷取應用資訊—PackageManager

Android 的應用管理主要是通過PackageManagerService來完成的。PackageManagerService服務負責各種APK包的安裝、解除安裝、優化和查詢。

PackageManagerService在啟動時會掃描所有的APK檔案和Jar包,然後把他們的資訊讀取出來,儲存在記憶體中,這樣系統在運作時就能迅速找到各種應用群組件的資訊。掃描過程中如果遇到沒有優化的檔案,還要執行轉換工作,将app檔案從dex格式轉換為oat格式(Android5.0之前是轉換為odex格式)。

Android應用管理一 APK包的安裝、解除安裝和優化

(PackageManagerService)

一、使用PackageManagerService

在應用中如果使用PackageManagerService服務,通常調用的是Context 的 getPackageManager() 方法,這個方法傳回的是PackageManager對象。

二、PackageManager API

Class for retrieving various kinds of information related to the application packages that are currently installed on the device.

1. packageInfo

public abstract PackageInfo getPackageInfo(String packageName, int flags)根據包名擷取對應的PackageInfo

PackageInfo packageInfo = packageManager.getPackageInfo(
                    context.getApplicationInfo().packageName, 0);
           

PackageInfo用于描述mainfest中所有描述資訊。

常見字段:

(1)public String packageName;包名

(2)public String[] splitNames;

(3)public int versionCode;版本号     

(4)public String versionName;版本名稱

(5)public ApplicationInfo applicationInfo;

(6)public long firstInstallTime;第一次安裝時間

(7)public long lastUpdateTime;上次更新時間

(8)public ActivityInfo[] activities;所有的Activity資訊

(9)public ActivityInfo[] receivers; 所有的廣播接收者

(10)public ServiceInfo[] services;所有的服務資訊

(11)public ProviderInfo[] providers;擷取ContentProvide

(12)public PermissionInfo[] permissions;所有的權限資訊

2. applicationInfo

public abstract ApplicationInfo getApplicationInfo(String packageName,

int flags),根據指定的包名擷取ApplicationInfo

ApplicationInfo applicationInfo = packageManager.getApplicationInfo(
                    context.getApplicationInfo().packageName, 0);
           

ApplicationInfo描述應用程式的基本資訊

常見字段:

(1)public String taskAffinity;

(2)public String permission;

(3)public String processName;

(4)public String className;

(5)public int descriptionRes;

(6)public static final int FLAG_SYSTEM = 1<<0;系統應用

(7)public static final int FLAG_EXTERNAL_STORAGE = 1<<18;安裝在外部存儲卡

(8)public static final int FLAG_LARGE_HEAP = 1<<20;支援大記憶體

3. 其它諸如ActivityInfo、ServiceInfo都類似,他們都是繼承自ComponentInfo類,唯一可以需要注意的就是各個類中的FLAG标簽的含義。

4. For Instance

獲得應用名稱、版本名稱、版本号

public ResultInfo getApplicationInfo(Context context) {
        PackageManager packageManager = context.getPackageManager();
        ApplicationInfo applicationInfo = null;
        PackageInfo packageInfo = null;
        try {
            applicationInfo = packageManager.getApplicationInfo(
                    context.getApplicationInfo().packageName, 0);
            packageInfo = packageManager.getPackageInfo(
                    context.getApplicationInfo().packageName, 0);
        } catch (final PackageManager.NameNotFoundException e) {
        }
        ResultInfo resultInfo = new ResultInfo();
        resultInfo.applicationName = packageManager.getApplicationLabel(
                applicationInfo).toString();//應用名稱
        resultInfo.applicationVersionCode = packageInfo.versionCode;
        resultInfo.applicationVersionName = packageInfo.versionName;
        return resultInfo;
    }