侧边栏壁纸
博主头像
Z同学博主等级

工作磨平激情前,坚持技术的热忱。 欢迎光临Z同学的技术小站。 分享最新的互联网知识。

  • 累计撰写 290 篇文章
  • 累计创建 57 个标签
  • 累计收到 98 条评论

Android 获取App列表,并进行跳转和卸载

Z同学
2020-08-28 / 0 评论 / 0 点赞 / 939 阅读 / 3,337 字
温馨提示:
本文最后更新于 2021-11-18,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

前言

从网上查询到的PackageInfo 直接获取的全部的app,这个app不管是否能够启动,是否系统应用,全部都查询了。但是作为LauncherApp 我只需要能够正常启动的app。

我的需求不是系统设置之中的应用管理,不需要那么多app。那么我们在查询过程之中就需要主动进行过滤了。

方法

//获取全部有Launcher关键字的app
public static List<AppInfo> getInstallApps(Context context) {
        List<AppInfo> appInfos = new ArrayList<>();
        Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
        mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
        // 通过查询,获得所有ResolveInfo对象.
        PackageManager packageManager = context.getPackageManager();
        List<ResolveInfo> resolveInfos = context.getPackageManager().queryIntentActivities(mainIntent, 0);
        // 调用系统排序 , 根据name排序
        // 该排序很重要,否则只能显示系统应用,而不能列出第三方应用程序
        Collections.sort(resolveInfos, new ResolveInfo.DisplayNameComparator(packageManager));
        for (ResolveInfo reInfo : resolveInfos) {
            if (BuildConfig.APPLICATION_ID.equals(reInfo.activityInfo.packageName))//过滤到自己本身
                continue;
            appInfos.add(new AppInfo().setAppInfo(reInfo, packageManager));
        }
        return appInfos;
    }


public class AppInfo {
    public String   packageName; //app的项目名称- applicationId
    public String   versionName; //app的版本名称
    public long     versionCode; //app的版本号
    public String   appLabel;//app的名称
    public Drawable icon;//app的logo图标
    public Drawable banner;//广告图
    public boolean  isSystem;//是否系统应用
    public Intent   intent;//启动意图


    public AppInfo setAppInfo(ResolveInfo resolveInfo, PackageManager packageManager) {
        String activityName = resolveInfo.activityInfo.name; // 获得该应用程序的启动Activity的name
        packageName = resolveInfo.activityInfo.packageName; // 获得应用程序的包名
        appLabel = (String) resolveInfo.loadLabel(packageManager); // 获得应用程序的Label
        icon = resolveInfo.loadIcon(packageManager); // 获得应用程序图标
        // 为应用程序的启动Activity 准备Intent
        intent = new Intent();
        intent.setComponent(new ComponentName(packageName, activityName));
        if ((resolveInfo.activityInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            //非系统应用
            isSystem = false;
        } else {
            isSystem = true;
            //系统应用
        }
        return this;
    }

public AppInfo setAppInfo(PackageInfo packageInfo, PackageManager packageManager) {
        packageName = packageInfo.packageName;   //app包名
        versionName = packageInfo.versionName;  //app的versionName
        versionCode = packageInfo.versionCode;
        appLabel = packageInfo.applicationInfo.loadLabel(packageManager).toString(); //app名
        icon = packageInfo.applicationInfo.loadIcon(packageManager);  //app图标
        banner = packageInfo.applicationInfo.loadBanner(packageManager);
        if ((packageInfo.applicationInfo.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            //非系统应用
            isSystem = false;
        } else {
            isSystem = true;
            //系统应用
        }
        return this;
    }
}

//通过packageName 获取的指定的AppInfo
public static AppInfo getLoadApp(Context context, String packageName) {
        AppInfo appInfo = new AppInfo();
        try {
            PackageInfo pi = context.getPackageManager().getPackageInfo(packageName, 0);
            appInfo.setAppInfo(pi, context.getPackageManager());
        } catch (PackageManager.NameNotFoundException e) {
            appInfo = null;
            e.printStackTrace();
        }
        return appInfo;
    }

//卸载
 public  static void quietUnInstallApk(Context context, String packageManager) {
        if ((context.getApplicationInfo().flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            //非系统应用
            Uri uri = Uri.fromParts("package", packageManager, null);
            Intent intent = new Intent(Intent.ACTION_DELETE, uri);
            context.startActivity(intent);
        } else {
            //系统应用- 可以直接跨过逻辑进行卸载
            Intent intent = new Intent();
            intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            PendingIntent sender = PendingIntent.getActivity(context, 0, intent, 0);
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                PackageInstaller mPackageInstaller = context.getPackageManager().getPackageInstaller();
                mPackageInstaller.uninstall(packageManager, sender.getIntentSender());// 卸载APK
            }
        }
    }
0

评论区