getRunningAppProcesses returns Android M(5.1.1) 上的空列表
getRunningAppProcesses returns empty list on Android M(5.1.1)
我刚刚测试了我的应用程序和 CM、ATM Android 助手等。它们都无法获取 运行 进程列表,但它们在 OS 之前的版本上工作正常。那么 Android M(5.1.1) 是怎么回事?请帮助!
am = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> list = am.getRunningAppProcesses();
Log.i(TAG, "LQ::examine list.size()=" + list.size());
我决定改用 getRunningServices!
Du Speed Booster & Power Clean 使用 getRunningServices 代替,也许 getRunningAppProcesses 将来会被弃用。
谢谢google,谢谢字母。
Hashtable<String, List<ActivityManager.RunningServiceInfo>> hashtable = new Hashtable<String, List<ActivityManager.RunningServiceInfo>>();
ActivityManager am = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo rsi : am.getRunningServices(Integer.MAX_VALUE)) {
if (isCanceled()) {
return;
}
String pkgName = rsi.service.getPackageName();
if (hashtable.get(pkgName) == null) {
List<ActivityManager.RunningServiceInfo> list = new ArrayList<ActivityManager.RunningServiceInfo>();
list.add(rsi);
hashtable.put(pkgName, list);
} else {
hashtable.get(pkgName).add(rsi);
}
}
int i = 0;
int size = hashtable.size();
for (Iterator it = hashtable.keySet().iterator(); it.hasNext(); i++) {
String key = (String) it.next();
List<ActivityManager.RunningServiceInfo> value = hashtable.get(key);
ProcessItem item = new ProcessItem(getContext(), value.get(0).pid, key, totalCpu, totalRam);
if (!whiteList.contains(item.pkgName)) {
if (!killList.contains(item.pkgName)) {
killList.add(item.pkgName);
ramTotal += item.ram;
if (getListener() != null) {
Progress progress = new Progress(this);
progress.setArg1(i);
progress.setArg2(size);
progress.setMsg(item.appName);
progress.setObj(item);
getListener().onExamining(progress);
}
}
}
}
hashtable.clear();
hashtable = null;
另一种选择是使用 UsageStatsManager
。
UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService(Context.USAGE_STATS_SERVICE);
long endTime = System.currentTimeMillis();
long beginTime = endTime - 1000*60;
// We get usage stats for the last minute
List<UsageStats > stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, beginTime, endTime);
// Sort the stats by the last time used
if(stats != null)
{
SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>();
for (UsageStats usageStats : stats)
{
mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
}
if(mySortedMap != null && !mySortedMap.isEmpty())
{
topActivity = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
为了使其正常工作,您需要 PACKAGE_USAGE_STATS
许可。您可以通过在设置中打开屏幕来提示用户执行此操作:
Intent usageAccessIntent = new Intent( Settings.ACTION_USAGE_ACCESS_SETTINGS );
usageAccessIntent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
startActivity( usageAccessIntent );
我可以在 android 6.0 上使用 getRunningServices(
) 方法获取前台应用程序列表。谢谢@thecr0w
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List appProcessInfoList = mActivityManager.getRunningServices(Integer.MAX_VALUE);
我刚刚测试了我的应用程序和 CM、ATM Android 助手等。它们都无法获取 运行 进程列表,但它们在 OS 之前的版本上工作正常。那么 Android M(5.1.1) 是怎么回事?请帮助!
am = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> list = am.getRunningAppProcesses();
Log.i(TAG, "LQ::examine list.size()=" + list.size());
我决定改用 getRunningServices!
Du Speed Booster & Power Clean 使用 getRunningServices 代替,也许 getRunningAppProcesses 将来会被弃用。
谢谢google,谢谢字母。
Hashtable<String, List<ActivityManager.RunningServiceInfo>> hashtable = new Hashtable<String, List<ActivityManager.RunningServiceInfo>>();
ActivityManager am = (ActivityManager) getContext().getSystemService(Context.ACTIVITY_SERVICE);
for (ActivityManager.RunningServiceInfo rsi : am.getRunningServices(Integer.MAX_VALUE)) {
if (isCanceled()) {
return;
}
String pkgName = rsi.service.getPackageName();
if (hashtable.get(pkgName) == null) {
List<ActivityManager.RunningServiceInfo> list = new ArrayList<ActivityManager.RunningServiceInfo>();
list.add(rsi);
hashtable.put(pkgName, list);
} else {
hashtable.get(pkgName).add(rsi);
}
}
int i = 0;
int size = hashtable.size();
for (Iterator it = hashtable.keySet().iterator(); it.hasNext(); i++) {
String key = (String) it.next();
List<ActivityManager.RunningServiceInfo> value = hashtable.get(key);
ProcessItem item = new ProcessItem(getContext(), value.get(0).pid, key, totalCpu, totalRam);
if (!whiteList.contains(item.pkgName)) {
if (!killList.contains(item.pkgName)) {
killList.add(item.pkgName);
ramTotal += item.ram;
if (getListener() != null) {
Progress progress = new Progress(this);
progress.setArg1(i);
progress.setArg2(size);
progress.setMsg(item.appName);
progress.setObj(item);
getListener().onExamining(progress);
}
}
}
}
hashtable.clear();
hashtable = null;
另一种选择是使用 UsageStatsManager
。
UsageStatsManager mUsageStatsManager = (UsageStatsManager)getSystemService(Context.USAGE_STATS_SERVICE);
long endTime = System.currentTimeMillis();
long beginTime = endTime - 1000*60;
// We get usage stats for the last minute
List<UsageStats > stats = mUsageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, beginTime, endTime);
// Sort the stats by the last time used
if(stats != null)
{
SortedMap<Long,UsageStats> mySortedMap = new TreeMap<Long,UsageStats>();
for (UsageStats usageStats : stats)
{
mySortedMap.put(usageStats.getLastTimeUsed(),usageStats);
}
if(mySortedMap != null && !mySortedMap.isEmpty())
{
topActivity = mySortedMap.get(mySortedMap.lastKey()).getPackageName();
}
}
为了使其正常工作,您需要 PACKAGE_USAGE_STATS
许可。您可以通过在设置中打开屏幕来提示用户执行此操作:
Intent usageAccessIntent = new Intent( Settings.ACTION_USAGE_ACCESS_SETTINGS );
usageAccessIntent.addFlags( Intent.FLAG_ACTIVITY_NEW_TASK );
startActivity( usageAccessIntent );
我可以在 android 6.0 上使用 getRunningServices(
) 方法获取前台应用程序列表。谢谢@thecr0w
ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List appProcessInfoList = mActivityManager.getRunningServices(Integer.MAX_VALUE);