Jac*_*1re 19 android process activity-manager
我正在尝试确定用户当前可见的应用程序.为此,我使用该activityManager.getRunningAppProcesses()
方法.
我知道Android 5.1.1不支持该方法 - 这没关系.
一开始它就像魅力一样,我正在迭代RunningAppProcessInfos列表并检查重要性.
tl; dr获取当前前台进程和防止错误postives的正确方法是什么?如何完成列表的顺序 - API说它没有指定.有没有办法正确订购它们?
我做了什么:
不幸的是,ActivityManager返回的列表在每个设备上都是不同的.某些设备返回具有重要性100(即FOREGROUND)的多个信息,即使该过程当前不可见.
这引起了我有很多误报的问题.例如,我每次用facebook测试它并创建一个吐司,每次facebook都在前台.我切换到Home,所以我的启动器应该是前台进程.这是10秒之后,在那之后,facebook又重新出现在列表中的FOREGROUND(它不是开放也不可见)而且我得到了误报.
我认识到有些设备按照最近的流程排序列表.所以我决定尝试以下方法:
ActivityManager.RunningAppProcessInfo appProcess = appProcesses.get(0);
final String processName = appProcess.processName;
final String packageName = removeProcessSuffix(processName);
if (appProcess.importance == FOREGROUND || appProcess.importance == VISIBLE){
//do something, like the toast
}
Run Code Online (Sandbox Code Playgroud)
使用appProcesses.get(0); 我只检查第一个元素,然后bug就消失了.再也没有误报了.
但是,现在在某些设备上,我根本不再获得前台进程.因为他们没有以任何方式订购列表.例如,一些4.2索尼智能手机是一些候选人.我得到了列表,但当前可见的进程是索引11左右.
我不知道该怎么做,以获得当前的前台进程,没有误报.
获取当前前台进程并防止错误假设的正确方法是什么?如何完成列表的顺序 - API说它没有指定.有没有办法正确订购它们?
谢谢!
获取当前前台进程并防止误报的正确方法是什么?
UsageStatsManager是获取当前正在运行的应用程序的唯一官方 API(请参阅#50)。
使用getRunningTasks(int maxNum)
,getRunningAppProcesses()
或AccessibilityService
来获取前台应用程序从来都不可靠。前两种方法的文档有以下警告:Note: this method is only intended for debugging
下面是使用UsageStatsManager获取顶级应用程序的示例:
Calendar endCal = Calendar.getInstance();
Calendar beginCal = Calendar.getInstance();
beginCal.add(Calendar.MINUTE, -30);
UsageStatsManager manager = (UsageStatsManager) getSystemService(Context.USAGE_STATS_SERVICE);
List<UsageStats> stats = manager.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,
beginCal.getTimeInMillis(), endCal.getTimeInMillis());
Collections.sort(stats, new Comparator<UsageStats>() {
@Override public int compare(UsageStats lhs, UsageStats rhs) {
long time1 = lhs.getLastTimeUsed();
long time2 = rhs.getLastTimeUsed();
if (time1 > time2) {
return -1;
} else if (time1 < time2) {
return 1;
}
return 0;
}
});
// The first "UsageStats" in the list will be the top application.
// If the list is empty you will need to ask for permissions to use UsageStatsManager
// To request permission:
// startActivity(new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS));
Run Code Online (Sandbox Code Playgroud)
我知道这不是你所希望的答案。CM Security和AppLock等应用程序在 Android 5.1.1+ 上使用UsageStatsManager 。由于 SeLinux,无法使用getRunningTasks(int maxNum)
或来获取前台应用程序getRunningAppProcesses()
。
归档时间: |
|
查看次数: |
1571 次 |
最近记录: |