gpt4 book ai didi

android - 使用 activityManager.getRunningAppProcesses() 获取(真实)前台进程

转载 作者:IT王子 更新时间:2023-10-28 23:32:44 28 4
gpt4 key购买 nike

我正在尝试确定用户当前可见的应用程序。为此,我使用 activityManager.getRunningAppProcesses() 方法。

我知道 Android 5.1.1 不支持该方法 - 没关系。

一开始它就像魅力一样,我正在遍历列表RunningAppProcessInfos 并检查其重要性。

tl;博士获取当前前台进程并防止误报的正确方法是什么?列表的顺序是如何完成的 - API 说它没有指定。有没有办法正确订购它们?

我做了什么:

不幸的是,ActivityManager 返回的列表在每个设备上都不同。一些设备返回多个重要性为 100(即 FOREGROUND)的信息,即使进程当前不可见。

这导致了我有很多误报的问题。例如,我每次都用 facebook 测试它并创建一个 toastfacebook 在前台。我切换到主页,所以我的启动器应该有一直是前台进程。大概 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
}

使用 appProcesses.get(0); 我只检查第一个元素,错误就消失了。不再有误报。

但是,现在在某些设备上我根本无法获得前台进程。因为他们不会以任何方式对列表进行排序。例如,一些 4.2 索尼智能手机就是其中的一部分。我得到了列表,但当前真正可见的进程在索引 11 左右。

我不知道该怎么做才能获得当前的前台进程,而不会出现误报。

获取当前前台进程并防止误报的正确方法是什么?列表的顺序是如何完成的 - API 说它没有指定。有没有办法正确订购它们?

谢谢!

最佳答案

What is the correct method to get current foreground process and prevent false positives?

UsageStatsManager是获取当前正在运行的应用程序的唯一官方 API (see #50)。

使用 getRunningTasks(int maxNum) , getRunningAppProcesses()AccessibilityService获取前台应用程序从来都不是可靠的。前两种方法的文档有以下警告:注意:此方法仅用于调试


以下是使用 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));

我知道这不是您希望的答案。 CM Security 同类应用和 AppLock使用 UsageStatsManager在 Android 5.1.1+ 上。由于 SeLinux,无法使用 getRunningTasks(int maxNum) 获取前台应用程序或 getRunningAppProcesses() .

关于android - 使用 activityManager.getRunningAppProcesses() 获取(真实)前台进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34208624/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com