Android 获取已运行程序列表 - ythy/blog GitHub Wiki
根据Android版本不同 分2种方式获取
需要设置权限:
<uses-permission android:name="android.permission.GET_TASKS" />
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
用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();
}
用 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();
}
}