我需要按packageName检查-是否正在运行应用程序。
在第21版之前,我只是获得正在运行的应用程序和舞蹈的列表。
但现在它不起作用-仅返回我的应用程序之一。
我知道我需要使用“统计信息用法”,但是找不到完整的示例。
我不需要所有这些分析,我需要一个简单的功能
bool isRunning(String packageName)
如何在新的Android(> 21)上实现它而不跳舞呢?
更新。最好的答案是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;
}
最佳答案
出于安全原因,无法以API级别(> 21)获取所有正在运行的应用程序。
但
您可以随时间访问应用使用历史记录和统计信息
间隔:UsageStatsManager
的天,周,月和年
这是官方文档Link
其他应用程序,例如clean master,ccleaner都使用此技术来获取正在运行的应用程序。
Here是使用UsageStatsManager
获取应用列表的示例
注意:使用UsageStatsManager
之前必须给Usage Access Permission