Android 获取已运行程序列表 - ythy/blog GitHub Wiki

根据Android版本不同 分2种方式获取

需要设置权限:

    <uses-permission android:name="android.permission.GET_TASKS"  />
    <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"

< android 21

getRecentTasks函数获取

        ImageButton ivIcon;
        ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE);
        PackageManager pm = this.getPackageManager();
        try {
            List<ActivityManager.RecentTaskInfo> list = am.getRecentTasks(8, 0);
            llTaskBar.removeAllViews();
            for (ActivityManager.RecentTaskInfo ti : list) {
                final Intent intent = ti.baseIntent;
                ResolveInfo resolveInfo = pm.resolveActivity(intent, 0);
                if (resolveInfo != null) {
                    ivIcon = new ImageButton(this);
                    ivIcon.setImageDrawable(resolveInfo.loadIcon(pm));
                    ivIcon.setFocusable(true);
                    ivIcon.setClickable(true);
                    ivIcon.setEnabled(true);
                    ivIcon.setScaleType(ImageView.ScaleType.CENTER);
                    ivIcon.setLayoutParams(new LinearLayout.LayoutParams(dip2px(60), dip2px(60)));
                    ivIcon.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            startActivity(intent);
                            onBack();
                        }
                    });
                    llTaskBar.addView(ivIcon);
                }
            }
        } catch (SecurityException se) {
            se.printStackTrace();
        }

>= android 21

queryUsageStats 获取, 需要系统设置, 弹出系统设置的方式:

Intent intent = new Intent(android.provider.Settings.ACTION_USAGE_ACCESS_SETTINGS);
startActivity(intent);

注意事项:

  • 此方法获取的程序列表,需要自行根据UsageStats.getLastTimeStamp 进行排序
  • getLaunchIntentForPackage 此方法会返回null, 需要做判断。原因:

The current implementation will look for a main activity in the category {@link Intent#CATEGORY_LEANBACK_LAUNCHER}, or return null if no main leanback activities are found.

  • queryUsageStats方法耗时,需要起新线程处理,不要占用UI线程

代码:

        final long currentTime = System.currentTimeMillis(); // Get current time in milliseconds
        final Calendar cal = Calendar.getInstance();
        cal.add(Calendar.HOUR, -1); // Set year to beginning of desired period.
        final long beginTime = cal.getTimeInMillis(); // Get begin time in milliseconds

        final UsageStatsManager usageStatsManager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
        final List<UsageStats> queryUsageStats = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_BEST, beginTime, currentTime);
        Collections.sort(queryUsageStats, new Comparator<UsageStats>() {
            @Override
            public int compare(UsageStats o1, UsageStats o2) {
                return (int) (o2.getLastTimeStamp() - o1.getLastTimeStamp());
            };
        });

        llTaskBar.removeAllViews();
        ImageButton ivIcon;
        for (final UsageStats us : queryUsageStats) {
            final PackageManager pm = this.getPackageManager();
            try {
                //PackageInfo pInfo =  pm.getPackageInfo(us.getPackageName(), 0);
                ivIcon = new ImageButton(this);
                ivIcon.setImageDrawable(pm.getApplicationIcon(us.getPackageName()));
                ivIcon.setFocusable(true);
                ivIcon.setClickable(true);
                ivIcon.setEnabled(true);
                ivIcon.setScaleType(ImageView.ScaleType.CENTER);
                ivIcon.setLayoutParams(new LinearLayout.LayoutParams(dip2px(60), dip2px(60)));
                final Intent ivIntent = pm.getLaunchIntentForPackage(us.getPackageName());
                if(ivIntent != null){
                    ivIcon.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View v) {
                            startActivity(ivIntent);
                            onBack();
                        }
                    });
                    llTaskBar.addView(ivIcon);
                }
            } catch (PackageManager.NameNotFoundException e) {
                e.printStackTrace();
            }

        }
⚠️ **GitHub.com Fallback** ⚠️