应用管理开发

本文介绍了Android中如何使用PackageManager管理应用,包括获取所有应用信息、启动、停止、卸载和清除其他应用数据的方法。详细讲解了不同flag的用法以及获取应用信息的主要类如ApplicationInfo、ActivityInfo等。此外,还提供了实现清除应用数据的系统权限方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

获取所有的应用信息PackageManager

Android通过PackageManager来管理应用程序包,我们可以使用它获取当前Android设备上的应用程序的信息。可以使用getPackageManager()方法获取该对象。使用getInstalledPackages(0)获取设备上所有的应用程序信息。如下:

  PackageManager packageManager=getActivity().getPackageManager();
  List<PackageInfo> list=packageManager.getInstalledPackages(0);
  for (PackageInfo info:list) {

  }

使用getInstalledPackages(int flag)方法获得一个设备上的应用程序的列表(通常flag取0)。参数flag为附加选项,指定对应的flag,可以获取一些额外的信息(对应的参数返回对应的额外信息)。你可以使用以下参数的任意组合(作按位或运算)来修改(不同的flag,返回的列表长度可能不同,应用程序的得到信息维度也可能不同)返回的数据:

// “GET_ ” 开头的flag :用于请求额外的数据,其他数据可能会被省去以节省线空间。(返回不同维度的应用信息)
//“MATCH_”开头的flag:用于包含组件或包,否则将由当前系统状态从结果集中省略。(返回的列表长度可能不同)

  • GET_ACTIVITIES //会在PackageInfo对象的activitys返回应用程序包的关于activity的信息
  • GET_CONFIGURATIONS //会在PackageInfo的configPreferences中返回硬件偏好信息,并在reqFeatures和featureGroups中请求特性
  • GET_GIDS //返回与应用程序相关的Gids
  • GET_INSTRUMENTATION //在instrumentation属性中返回应用程序的仪表仪器的相关信息
  • GET_INTENT_FILTERS //返回activity 支持的intent filter信息
  • GET_META_DATA //返回组件的meta-data数据,数据类型为Bundle
  • GET_PERMISSIONS //返回应用程序的应用程序包的权限信息
  • GET_PROVIDERS //返回应用程序的content provider的信息
  • GET_RECEIVERS //返回应用程序的广播receiverde 信息
  • GET_SERVICES //返回应用程序services的信息
  • GET_SHARED_LIBRARY_FILES //与此应用程序链接的所有共享库的路径
  • GET_SIGNATURES //返回包中包含的签名信息
  • GET_URI_PERMISSION_PATTERNS //返回ContentProvider相关的URL许可模式
  • MATCH_DISABLED_COMPONENTS //返回失效组件的信息
  • MATCH_UNINSTALLED_PACKAGES //检索所有有数据目录的应用程序(包括未安装的应用程序)
  • MATCH_DISABLED_UNTIL_USED_COMPONENTS
  • MATCH_SYSTEM_ONLY

应用过滤或分组:

 if ((flags& ApplicationInfo.FLAG_SYSTEM)!=0){
     //系统应用
 }else {
    //非系统应用
 }
 //根据业务需求对应用进行分组或过滤

AndroidMenfest.xml节点关系图: 图片来自参考[1]
AndroidMenfest.xml节点关系图

PackageManger获取信息的主要方法与属性:
这里写图片描述


获取应用信息的主要类

PackageItemInfo
是包含应用包管理器的所有包项的共有信息的基类。这提供了一个非常常见的基本属性集合: label,icon, meta-data等。这个类并不是直接使用,它仅仅是为了共享包管理返回的所有项的公共定义。

PackageItemInfo的派生关系

这里写图片描述

ApplicationInfo:
可以检索指定应用的信息。它的信息也AndroidManifest.xml的 < application >标签对应。

ComponentInfo:
包含所有应用组件的共有信息的基类。

  • ActivityInfo: 可以通过检索指定应用的activity或receiver来获得信息,它和AndroidManifest.xml的< activity >标签, < receiver>标签的信息对应
  • ProviderInfo:根据一个明确的content provider获取信息,通过PackageManager.resolveContentProvider()返回数据
  • ServiceInfo:通过应用检索指定应用的服务获取信息,它和AndroidManifest.xml的< service>标签的信息对应

InstrumentationInfo:
它和AndroidManifest.xml 的标签信息对应。

PermissionGroupInfo:
它和AndroidManifest.xml 的标签信息对应。

PermissionInfo
它和AndroidManifest.xml 的标签信息对应。


启动其他应用

//方式一
 PackageManager packageManager = getActivity().getPackageManager();
 Intent it= packageManager.getLaunchIntentForPackage(packageName);
 startActivity(it);

//方式二
ComponentName componentName = new ComponentName(packagename, activitypath);
Intent intent = new Intent();
intent.setComponent(componentName);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);

停止其他应用

ActivityManager manager = (ActivityManager) getActivity().getSystemService(ACTIVITY_SERVICE);
manager.killBackgroundProcesses(packageName);

卸载其他应用

  Uri uri = Uri.parse("package:" + packageName);
  Intent intent = new Intent(Intent.ACTION_DELETE, uri);
  context.startActivity(intent);

清除其他应用数据

清除其他应用数据需要系统权限。利用反射实现功能,实现方法如下:[2]

  private boolean clearApp(String packageName) {
       ActivityManager am =    (ActivityManager)getActivity().getSystemService(Context.ACTIVITY_SERVICE);
    try {
        Class<?> amClass = Class.forName(am.getClass().getName());
        Method clearApp = amClass.getMethod("clearApplicationUserData", String.class, IPackageDataObserver.class);
        clearApp.invoke(am, packageName, new IPackageDataObserver() {
            @Override
            public IBinder asBinder() {
                return null;
            }

            @Override
            public void onRemoveCompleted(String packageName, boolean succeeded) throws RemoteException {

            }
        });
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
    return true;
}

创建包路径:main/aidl/android/content/pm ,在该路径下放入文件IPackageDataObserver.aidl。

在AndroidManifest.xml文件中添加:

<manifest ...
     android:sharedUserId="android.uid.system">
    ...
<uses-permission android:name="android.permission.CLEAR_APP_USER_DATA" />

最后使用对应的系统签名打包,打包命令如下:

java -jar signapk.jar platform.x509.pem platform.pk8 myapps.apk myapps_signed.apk

参考:
[1]https://blog.csdn.net/u012532559/article/details/52805632
[2]https://blog.csdn.net/lnn368/article/details/52684122

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值