1、扫描手机已安装APP
通过PackageManager可以获取手机端已安装的apk文件的信息
1.1、获取本机所有已安装应用
PackageManager通过getInstalledPackages(flag)获取,传入flag为0表示所有APP。
PackageManager pm= context.getPackageManager();
//获取手机内所有应用
List<PackageInfo> paklist = pm.getInstalledPackages(0);1.2、获取本机系统应用
(packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
for (PackageInfo packageInfo : installedPackages) {
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) > 0) {
//系统预装应用
}
}
1.3、获取用户安装应用
(packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);
for (PackageInfo packageInfo : installedPackages) {
if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) <= 0) {
//用户安装的APP
}
}
1.4、获取可以打开的应用
获取到手机应用列表后,可以进行打开应用,卸载等操作。有些APP是服务类型的本身没有Activity,不能打开。需要进行过滤,但是不能单纯的通过系统应用还是非系统应用进行过滤,比如短信、电话属于系统应用,但是可以打开。
①先获取到所有应用
List<PackageInfo> installedPackages = packageManager.getInstalledPackages(0);②通过Intent查询可以打开的ResolveInfo
Intent intent = new Intent(Intent.ACTION_MAIN, null);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
List<ResolveInfo> resolveInfos = packageManager.queryIntentActivities(intent, 0);③将可打开的packageName放入Set集合去重
Set<String> canOpenApp = new HashSet<String>();
for (ResolveInfo resolveInfo : resolveInfos) {
canOpenApp.add(resolveInfo.activityInfo.packageName);
}④在对第一步中获得到的所有应用集合进行遍历,根据第二三步得到的Set进行判断是否可以打开该应用
for (PackageInfo packageInfo : installedPackages) {
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
if (canOpenApp.contains(applicationInfo.packageName)) {
//可以打开的应用,添加到集合
}
}
2、打开第三方APP
打开第三方APP方法更多,之前也介绍过打开Activity的几种方法。这里差不多,也是通过Intent去启动第三方APP。不过有时候我们有时候不知道其它APP的具体细节,比如启动的Action,MainActivity类名等。只知道包名也可以直接启动APP。
2.1、通过包名启动
第三方APP的包名很容易获得,通过PackageManager获得启动该APP的Intent:
Intent intent = context.getPackageManager().getLaunchIntentForPackage(packageName);
if (null != intent) {
context.startActivity(intent);
}2.2、通过包名和指定类名启动
已知包名和类名启动应用程序
Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
//设置包名,和MainActivity
ComponentName cn = new ComponentName(packageName, className);
intent.setComponent(cn);
context.startActivity(intent);2.3、通过包名和Action启动
第三方应用的包名和指定类的action启动,可以启动第三方应用的指定Activity。对方能够处理该Action的应用会自动打开处理。
Intent mIntent = new Intent();
//包名
mIntent.setPackage(packageName);
//某个特点Activity节点下注册的Action
mIntent.setAction(action);
context.startActivity(mIntent);3、卸载指定包名的APP
卸载APP有很多种方法,最简单的是通过Intent调用系统的卸载程序进行卸载。
3.1、通过Intent卸载应用(推荐)
调用系统的卸载程序进行卸载,需要一个权限,才能正常请求系统进行卸载:
<uses-permission android:name="android.permission.REQUEST_DELETE_PACKAGES" />代码很简单,方法如下:
public static boolean uninstall(Context context, String packageName) {
if (packageName == null || "".equals(packageName)) {
return false;
}
Uri uri = Uri.parse("package:" + packageName);
Intent intent = new Intent(Intent.ACTION_DELETE, uri);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.startActivity(intent);
return true;
}弹出系统卸载对话框:

对于系统应用无法卸载,弹出卸载失败通知。

3.2、PackageManager静默卸载应用
系统应用才可以使用,且需要权限android.permission.DELETE_PACKAGES

4、获取第三方应用的图标Drawable
很简单,通过PackageManager得到PackageInfo,再借助其中的ApplicationInfo调用loadIcon(PackageManager)即可得到图标,设置给ImageView。
ApplicationInfo applicationInfo = packageInfo.applicationInfo;
Drawable iconDrawable = applicationInfo.loadIcon(packageManager);
