Android:如何检查应用程序是否正在运行

时间:2019-02-11 08:27:20

标签: java android runtime

我需要按packageName检查-是否正在运行应用程序。 在第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 :(得分:0)

您可以访问this文档。向下滚动到方法部分。其中一些方法需要许可,而某些方法仅用于调试。希望有帮助。

答案 1 :(得分:0)

出于安全原因,没有任何方法可以使所有正在运行的应用程序处于API级别(> 21)。

但是

  

您可以随时间访问应用使用历史记录和统计信息   间隔:{,{1}}

的天,周,月和年

这是官方文档Link

clean master,ccleaner 之类的其他应用程序使用此技术来获取正在运行的应用程序。

Here是使用UsageStatsManager

获取应用列表的示例
  

注意:在使用UsageStatsManager

之前,您必须先提供 Usage Access Permission