Могу ли я обнаружить, что все приложения в телефоне Android работают в фоновом режиме или нет? - PullRequest
0 голосов
/ 06 мая 2019

Я хочу разработать приложение, которое может обнаруживать, что все другие приложения работают в фоновом режиме или нет, не только мое собственное приложение.

Я много искал, но почти все они обнаруживают свое собственное приложение, а не все.

Любая помощь будет по достоинству оценена, спасибо!

1 Ответ

3 голосов
/ 06 мая 2019

Посмотрите на этот метод, который я создал, чтобы получить все выполняющиеся задачи:

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_ACCESSBILITY - это int REQUEST_ACCESSBILITY = 100, используйте любое число для запроса.

...