Android获取手机已安装的应用程序并启动

最近在做项目的时候,需要获取手机上的应用程序并启动,一个类似桌面软件的应用。

1.布局我们使用一个GridView来呈现应用程序这里就不贴代码了,首先来获取已安装的app

//扫描手机上的应用是一个耗时操作,所以把它放在一个线程中执行
new Thread(new Runnable() {
            @Override
            public void run() {
                List<PackageInfo> packageInfo = getPackageManager()
                        .getInstalledPackages(PackageManager.GET_UNINSTALLED_PACKAGES);
                GetAppInfo getAppInfo = new GetAppInfo(MainActivity.this, packageInfo);
                apps = getAppInfo.getApps();
                handler.sendEmptyMessage(0);
            }
        }).start();

    //显示列表
   AppAdapter adapter = new AppAdapter(apps, MainActivity.this);
            gridView.setAdapter(adapter);

2.来具体看下GetAppInfo类中的处理

/**ApplicationInfo 中为我们封装了一系列app的属性和相关的东西,
这里只获取了我需要的几个内容没有兴趣的可以看下ApplicationInfo 都封装了什么*/

    private List<PackageInfo> packageInfo;
    private PackageManager packageManager;
    private List<AppItem> list;

    public GetAppInfo(Context context, List<PackageInfo> packageInfo) {
        this.packageInfo = packageInfo;
        packageManager = context.getPackageManager();
        list = new ArrayList<>();
    }


public List<AppItem> getApps() {
        for (PackageInfo info : packageInfo) {
            ApplicationInfo appInfo = info.applicationInfo;
            //去除系统应用
            if (!filterApp(appInfo)) {
                continue;
            }
            //拿到应用程序的图标
            Drawable icon = appInfo.loadIcon(packageManager);
            //拿到应用程序的程序名
            String appName = appInfo.loadLabel(packageManager).toString();
            //拿到应用程序的包名
            String packageName = appInfo.packageName;
            //拿到应用程序apk路径
            String apkePath = appInfo.sourceDir;
            //获取应用程序启动意图
            Intent intent = packageManager.getLaunchIntentForPackage(packageName);
            AppItem appItem = new AppItem(icon, appName, packageName, intent);
            list.add(appItem);
        }
        return list;
    }

过滤一些系统app

    /**
     * 判断某一个应用程序是不是系统的应用程序,
     * 如果是返回true,否则返回false。
     */
    public boolean filterApp(ApplicationInfo info) {
        //有些系统应用是可以更新的,如果用户自己下载了一个系统的应用来更新了原来的,它还是系统应用,这个就是判断这种情况的
        if ((info.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0) {
            return true;
            //判断是不是系统应用
        } else if ((info.flags & ApplicationInfo.FLAG_SYSTEM) == 0) {
            return true;
        }
        return false;
    }

3.AppItem是一个实体类,对获取到的东西进行封装这里就不贴出代码了。既然获取到应用了,那我们来尝试打开

//就一行代码可以实现,主要还是上面封装的代码
startActivity(apps.get(position).getIntent());

国际惯例最后上效果图

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Code-Porter

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值