Android Apk 應用信息獲取之 PackageManager

Manifest配置圖:
這裏寫圖片描述

圖中,可以看到系統對每個節點信息進行了封裝, 提供了各種類來存儲對應節點的信息,通過PackageManager就可以獲取對應的節點信息。

  • PackageInfo 包含了所有的acitity service信息
    常用的字段
    public String packageName —— 包名
    public ActivityInfo[] activities —— 所有< activity >節點信息
    public ApplicationInfo applicationInfo ——– < applicatio n>節點信息,只有一個
    public ActivityInfo[] receivers ——- 所有< receiver >節點信息,多個
    public ServiceInfo[] services ——- 所有< service >節點信息 ,多個
  • ApplicationInfo
    封裝了< application> 與< / application >之間的信息,包含了很多flags字段,比如 FLAG_SYSTEM 系統應用程序, FLAG_EXTERNAL_STORAGE 表示該應用安裝在sdcard中,FLAG_UPDATED_SYSTEM_APP 升級系統應用
    舉例:
    (ApplicationInfo.FLAG_SYSTEM & applicationInfo.flags) != 0 // 系統程序
    (ApplicationInfo.FLAG_SYSTEM & applicationInfo.flags) <= 0 //第三方程序
    注:當系統程序升級後,也可以成爲第三方程序: (ApplicationInfo.FLAG_UPDATED_SYSTEM_APP & applicationInfo.flags) != 0
    (ApplicationInfo.FLAG_EXTERNAL_STORAGE & applicationInfo.flags) != 0 //表示安裝在sd卡上的應用
  • ActivityInfo
    封裝了< activity> 與< / activity >之間以及< receiver> 與< / receiver >之間的信息,比如name,label,icon,launchmod等信息
  • ServiceInfo
    封裝了< service> 與< / service >之間的信息,
  • ResolveInfo
    根據< intent>節點來獲取其上一層目錄的信息,通常是< activity>、< receiver>、< service>節點信息。
    返回指定< intent>的resolveInfo對象,activity集合或者service集合
    public ActivityInfo activityInfo 獲取 ActivityInfo對象,即< activity>或< receiver >節點信息
    public ServiceInfo serviceInfo 獲取 ServiceInfo對象,即< service>節點信息
    舉例:
    String packagename = info.activityInfo.packageName;
    String name = info.activityInfo.name;
    String lable = info.activityInfo.loadLabel(pm).toString();

以上都會繼承PackageItemInfo基類,
常用字段:
public int icon 獲得該資源圖片在R文件中的值 (對應於android:icon屬性)
public int labelRes 獲得該label在R文件中的值(對應於android:label屬性)
public String name 獲得該節點的name值 (對應於android:name屬性)
public String packagename 獲得該應用程序的包名 (對應於android:packagename屬性)
常用方法:
Drawable loadIcon(PackageManager pm) 獲得當前應用程序的圖像
CharSequence loadLabel(PackageManager pm) 獲得當前應用程序的label
所以說 以上類都能直接使用loadIcon(PackageManager pm) 和loadLabel(PackageManager pm) 來獲取相應節點的信息


PackageManager
PackageManager 作爲管理類,可以對上述不同的Bean對象進行調用,首先,通過getPackageManager返回一個PackageManager的對象來調用各種方法,獲取不同Bean對象了.

常用方法:
(1)、public abstract PackageInfo getPackageInfo(String packageName, int flags)根據包名獲取對應的PackageInfo,注意,此處的flags標籤:
GET_ACTIVITIES
GET_GIDS
GET_CONFIGURATIONS
GET_INSTRUMENTATION
GET_PERMISSIONS
GET_PROVIDERS
GET_RECEIVERS
GET_SERVICES
GET_SIGNATURES
GET_UNINSTALLED_PACKAGES
舉例:
packageInfo = packageManager.getPackageInfo(“com.kevin.materialdesigndemo”, PackageManager.GET_ACTIVITIES);
Log.d(TAG, packageInfo.packageName + “\n” + packageInfo.versionName + “\n” )
(2)、public abstract ApplicationInfo getApplicationInfo(String packageName, int flags)
根據指定的包名獲取ApplicationInfo信息。flags 是此ApplicationInfo標記,通常可以直接賦予常數0
ApplicationInfo applicationInfo = pm.getApplicationInfo(packagename, 0);
(3)、public abstract ActivityInfo getActivityInfo(ComponentName component,int flags),
根據指定的組件,獲取ActivityInfo信息
舉例:
Drawable loadIcon = pm.getActivityIcon(new ComponentName(packagename, name));
(4)、public abstract ServiceInfo getServiceInfo(ComponentName component,int flags),根據指定組件獲取ServiceInfo
(5)、public abstract ProviderInfo getProviderInfo(ComponentName component,int flags),根據指定組件名稱獲取ProviderInfo信息
(6)、public abstract List< PackageInfo> getInstalledPackages(int flags);獲取所有安裝的PackagInfo信息
舉例1:
List< PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_ACTIVITIES);
獲取所有Package的信息,獲得PackageInfo集合,遍歷每個PackageInfo可以獲取每個Package裏的詳情信息。由於我們設置的是Activity,所以在對應的PackageInfo中activities中有值。
舉例2:
List< PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_SERVICES);
獲取所有Package的信息,獲得PackageInfo集合,遍歷每個PackageInfo可以獲取每個Package裏的詳情信息。由於我們設置的是Serviece,所以在對應的PackageInfo中Serviece中有值。
舉例3:
List< PackageInfo> listPack = packageManager.getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
(7)、public abstract List< ApplicationInfo> getInstalledApplications(int flags);
獲取安裝的ApplicationInfo信息
List< ApplicationInfo> listAppcations = pm
.getInstalledApplications(PackageManager.GET_UNINSTALLED_PACKAGES);
(8)、 public abstract List< ResolveInfo> queryIntentActivities(Intent intent, int flags) 
返回指定intent的resovleInfo的對象,其實就是activity集合
舉例1:
final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
List< ResolveInfo> allapplist = pm.queryIntentActivities(mainIntent, 0);
舉例2:
Intent resolveIntent = new Intent();
resolveIntent.addCategory(Intent.CATEGORY_LAUNCHER);
resolveIntent.setAction(Intent.ACTION_MAIN);
resolveIntent.setPackage(packagename);
List < ResolveInfo> infos = pm.queryIntentActivities(resolveIntent, 0);
舉例3:
Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
// 通過查詢,獲得所有ResolveInfo對象.
List< ResolveInfo> resolveInfos = pm
.queryIntentActivities(mainIntent, PackageManager.MATCH_DEFAULT_ONLY);

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