文章目錄
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 的信息的時候,不會獲取到這麼細緻的數據,如果有,看看這幾個類準沒錯