获取所有的应用信息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]
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