Android: как проверить, запущено приложение или нет - PullRequest
0 голосов
/ 11 февраля 2019

Мне нужно проверить по packageName - запущено приложение или нет.До v.21 я просто получаю список запущенных приложений и танцую.Но теперь это не работает - возвращает только одно мое приложение.Я знаю, что мне нужно использовать «Использование статистики», но не могу найти полностью пример для этого.

Мне не нужна вся эта аналитика, мне нужна одна простая функция

bool isRunning(String packageName)

Как реализовать это на новом Android (> 21) без танцев вокруг него?

upd.Ответ code4rox самый лучший.Все в порядке, спасибо!

Я использую этот код для проверки прав:

import android.content.pm.PackageManager;
import android.content.pm.ApplicationInfo;
import android.app.AppOpsManager;
import android.util.Log;
import  android.provider.Settings;

try {
            PackageManager packageManager = getContext().getPackageManager();
            ApplicationInfo applicationInfo = packageManager.getApplicationInfo(getContext().getPackageName(), 0);
            AppOpsManager appOpsManager = (AppOpsManager) getContext().getSystemService(Context.APP_OPS_SERVICE);
            int mode = appOpsManager.checkOpNoThrow(AppOpsManager.OPSTR_GET_USAGE_STATS, applicationInfo.uid, applicationInfo.packageName);
            if (!(mode == AppOpsManager.MODE_ALLOWED)) {
                Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
                startActivity(intent);
            }
        } catch (PackageManager.NameNotFoundException e) {}

И это для проверки приложения:

import android.util.Log;
import android.app.usage.UsageStatsManager;
import android.app.usage.UsageStats;
import java.util.List;
import java.util.SortedMap;
import java.util.TreeMap;
import java.util.ArrayList;

public boolean isRunning(Context context, long timeMills, String app) {
        boolean result = false;
        //timeMils = 1000
        UsageStatsManager usm = (UsageStatsManager)context.getSystemService(Context.USAGE_STATS_SERVICE);
        long time = System.currentTimeMillis();
        List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY,  time - timeMills, time);
        if (appList != null && appList.size() > 0) {
            for (UsageStats usageStats : appList) {
                String appname = usageStats.getPackageName();
                Log.i("DOM_LAUNCHER", "Running app: " + appname);
                if (app.equals(appname)) {
                    result = true;
                }
            }
        }
        return result;
    }

Ответы [ 2 ]

0 голосов
/ 11 февраля 2019

По соображениям безопасности невозможно получить все запущенные приложения на уровне API (> 21).

НО

Вы можетедоступ к истории использования приложения и статистике с интервалами времени: дни, недели, месяцы и годы с UsageStatsManager

Вот официальные документы Ссылка

Другие приложения, такие как clean master, ccleaner , используют эту технику для запуска приложений.

Здесь - пример получения списка приложений с использованием UsageStatsManager

Примечание: Вы должны дать Разрешение на использование перед использованием UsageStatsManager

0 голосов
/ 11 февраля 2019

Вы можете посетить эту документацию.Прокрутите вниз до раздела методов.Некоторые методы требуют разрешения, а некоторые предназначены только для отладки.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...