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);

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android系统中,要获取已安装的apk文件,可以使用以下步骤: 1. 首先,要获取apk文件,需要先获取应用的包名。可以使用PackageManager类来获取应用程序的信息。例如,可以使用getInstalledPackages()方法获取已安装应用的列表,然后通过遍历列表来获取每个应用程序的包名。 2. 获取包名后,可以通过PackageManager类的getApplicationInfo()方法来获取应用程序的详细信息,包括其数据目录。 3. 在应用程序详细信息中,可以通过applicationInfo.sourceDir来获取apk文件的路径。该路径可以用于读取apk文件的内容或者进行一些其他操作。 例如,可以使用以下代码片段来获取已安装应用apk文件路径: PackageManager packageManager = getPackageManager(); List<PackageInfo> packageList = packageManager.getInstalledPackages(0); for(PackageInfo packageInfo : packageList) { ApplicationInfo appInfo = packageManager.getApplicationInfo(packageInfo.packageName, 0); String apkPath = appInfo.sourceDir; // 可以使用apkPath来进行apk文件的相关操作 } 需要注意的是,为了获取已安装应用的详细信息,需要在AndroidManifest.xml文件中添加相应的权限。例如,<uses-permission android:name="android.permission.GET_PACKAGE_SIZE" />可以用于获取应用程序的大小,而<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />可以用于读取外部存储的应用文件。 总之,通过PackageManager类和ApplicationInfo类,可以获取已安装应用的详细信息,包括apk文件的路径。根据这些信息,可以对apk文件进行一些操作,如读取内容或进行备份等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值