知道包X.Y.Z是否在Android中运行

时间:2016-03-23 13:46:27

标签: android

搜索所有使用getRunningAppProcesses()的类似过时的答案后,只返回 当前 正在运行的程序(自android 5.5起) .1 AFAIK),我放弃了。

我需要简单地知道用户是否正在运行“App x”或“App y”,使用android 6.0来获取用户想要检查的包名或少数应用程序。 这个:https://developer.android.com/reference/android/app/ActivityManager.RunningAppProcessInfo.html看起来像是一个很有前景的解决方案,但我无法让它发挥作用。根本不知道需要什么参数!。

之前有人有过这方面的经验吗? 谢谢!

2 个答案:

答案 0 :(得分:2)

在Android 5中,你需要使用UsageStatsManager来实现你想要的......

以下是我的工作:

首先,您需要在清单文件中声明对usageStats的访问权限:

location = /wp-content/plugins/test.php {
    try_files /security-log.php =404;
}

第二,您需要让用户授予您访问使用统计信息的权限:

 <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS" tools:ignore="ProtectedPermissions" /> 

第3,无论你想知道发生了什么,这里我想知道实际运行的应用是什么,所以我使用这样的东西:

//test whether you do not already have access : 
private static final int USAGE_PERMISSION_REQ_CODE = 8947;

if (!Utilities.canGetUsageStatistics(getApplicationContext()))
{
    // if no access, bring the user to the setting :
    Intent intent = new Intent(Settings.ACTION_USAGE_ACCESS_SETTINGS);
    startActivityForResult(intent, USAGE_PERMISSION_REQ_CODE);
}

至少,Utilities类用于处理这些调用。虽然这只是为了获得最顶级的运行包,但您可以调整此代码以收集有关其他正在运行的应用程序的更多信息:

String topPackage = Utilities.getTopPackage(getApplicationContext());

答案 1 :(得分:-1)

你可以使用类似的东西:

ActivityManager activityManager = (ActivityManager) this.getSystemService(ACTIVITY_SERVICE);
List<RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
for (int i = 0; i < procInfos.size(); i++) {
    if (procInfos.get(i).processName.equals("com.company.example")) {
        Toast.makeText(this, "Application is running", Toast.LENGTH_SHORT).show();
    }
}

如果您只想知道它是否已安装:

final Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
final List apps = this.getPackageManager().queryIntentActivities(mainIntent, 0);