有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java安卓:如何检查应用程序是否正在运行

我需要通过packageName来检查是否运行应用程序。 在第21节之前,我只是简单地得到正在运行的应用程序和舞蹈的列表。 但现在它不工作了-只返回一个我的应用程序。 我知道我需要使用“统计使用”,但找不到完整的例子

我不需要所有这些分析,我需要一个简单的功能

bool isRunning(String packageName)

如何在新安卓系统(>;21)上实现它,而不在它周围跳舞

upd。code4rox的答案最好。一切都好,谢谢

我将此代码用于检查权限:

import 安卓.content.pm.PackageManager;
import 安卓.content.pm.ApplicationInfo;
import 安卓.app.AppOpsManager;
import 安卓.util.Log;
import  安卓.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) {}

此为check应用程序:

import 安卓.util.Log;
import 安卓.app.usage.UsageStatsManager;
import 安卓.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) 个答案

  1. # 1 楼答案

    出于安全原因,无法将所有正在运行的应用程序设置为API级别(>;21)

    但是

    You can access to app usage history and statistics with the time intervals: days, weeks, months, and years with UsageStatsManager

    这是官方文件Link

    其他应用程序,如clean master、ccleaner,都使用这种技术来运行应用程序

    Here是使用UsageStatsManager获取应用程序列表的示例

    Note: You must give Usage Access Permission before use UsageStatsManager

  2. # 2 楼答案

    您可以访问this文档。向下滚动至方法部分。有些方法需要权限,有些仅用于调试。希望有帮助