【问题标题】:Can I detect all applications in android phone are running in background or not?我可以检测到 android 手机中的所有应用程序都在后台运行吗?
【发布时间】:2019-09-23 18:19:41
【问题描述】:

我想开发一个可以检测所有其他应用程序是否在后台运行的应用程序,而不仅仅是我自己的应用程序。

我做了很多搜索,但几乎所有人都在检测自己的应用程序,而不是全部。

任何帮助将不胜感激,谢谢!

【问题讨论】:

  • 你不能这样做(除非你的应用有root权限)

标签: android background detect foreground


【解决方案1】:

看看我创建的这个方法来获取所有正在运行的任务:

private void getRunningApps() {
    ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
    assert manager != null;
    if (android.os.Build.VERSION.SDK_INT <= 22) {
        List<ActivityManager.RunningTaskInfo> task = manager.getRunningTasks(5);
    } else {
        String mpackageName = manager.getRunningAppProcesses().get(0).processName;
        UsageStatsManager usage = (UsageStatsManager) mContext.getSystemService(Context.USAGE_STATS_SERVICE);
        long time = System.currentTimeMillis();
        assert usage != null;
        List<UsageStats> stats = usage.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, 0, time);
        if (stats != null) {
            SortedMap<Long, UsageStats> runningTask = new TreeMap<>();
            for (UsageStats usageStats : stats) {
                runningTask.put(usageStats.getLastTimeUsed(), usageStats);
            }
        }
    }
}

您需要权限才能获取清单中的所有任务:

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

对于 Android M 或更高版本的动态检查权限:

@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public boolean isAccessGranted() {
    try {
        PackageManager packageManager = getPackageManager();
        ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getPackageName(), 0);
        AppOpsManager appOpsManager = (AppOpsManager) getSystemService(Context.APP_OPS_SERVICE);
        int mode = 0;
        if (Globals.currentVersion > android.os.Build.VERSION_CODES.KITKAT) {
            assert appOpsManager != null;
            mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS,
                    applicationInfo.uid, applicationInfo.packageName);
        }
        return (mode == AppOpsManager.MODE_ALLOWED);
    } catch (PackageManager.NameNotFoundException e) {
        return false;
    }
}

请求许可。这里是:

Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
            startActivityForResult(intent, REQUEST_ACCESSBILITY);

REQUEST_ACCESSBILITYint REQUEST_ACCESSBILITY = 100 的位置,请使用任何数字进行请求。

【讨论】:

  • 非常感谢!!我会试试这个,如果它有效,我会回复你!谢谢!
  • 不推荐使用 get_tasks 权限。取而代之的是,get_real_tasks 似乎是新的权限,但根据官方的说法,它不能被 3rd 方应用程序使用。
  • 是的!根据官方的说法,它不能被 3rd 方应用程序使用。但它仍然适用于 AppLock 等应用程序或任何其他与后台应用程序相关的工作。相信我,使用没有问题。 :)
猜你喜欢
  • 2021-10-18
  • 2011-05-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-01
  • 2012-12-22
  • 1970-01-01
  • 2017-05-09
相关资源
最近更新 更多