只能在Android Lollipop 5.0中获取前台活动名称

我使用以下代码来获取variablesforegroundTaskPackageName中的前台应用程序的活动名称。 它适用于4.1到4.4之间的所有操作系统版本,但不适用于Android 5.0 Lollipop。

任何人都可以帮助改变5.0棒棒糖? 在棒棒糖 – 我得到的foregroundTaskPackageName文本只是'Launcher3'。 我正在使用Genymotion模拟器。

ActivityManager am = (ActivityManager) getSystemService(ACTIVITY_SERVICE); RunningTaskInfo foregroundTaskInfo = am.getRunningTasks(1).get(0); // get // list // of // running // tasks String foregroundTaskAppName = null; String foregroundTaskPackageName = foregroundTaskInfo.topActivity .getPackageName(); 

Solutions Collecting From Web of "只能在Android Lollipop 5.0中获取前台活动名称"

您需要使用新的UsageStatsManager并调用其queryUsageStats方法来获取已启动活动的历史logging。 请注意,该用户将被要求提供使用访问使用统计在安全 – >应用程序使用访问的设备设置。

链接:

UsageStatsManager文档

queryUsageStats方法文档

这对我来说棒棒糖(21):

  ActivityManager manager = (ActivityManager)mContext.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses(); Log.i("current_app",tasks.get(0).processName); 

您可以使用下面的代码并获取当前的前台活动包名称。

  if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.LOLLIPOP) { // intentionally using string value as Context.USAGE_STATS_SERVICE was // strangely only added in API 22 (LOLLIPOP_MR1) @SuppressWarnings("WrongConstant") UsageStatsManager usm = (UsageStatsManager) getSystemService("usagestats"); long time = System.currentTimeMillis(); List<UsageStats> appList = usm.queryUsageStats(UsageStatsManager.INTERVAL_DAILY, time - 1000 * 1000, time); if (appList != null && appList.size() > 0) { SortedMap<Long, UsageStats> mySortedMap = new TreeMap<Long, UsageStats>(); for (UsageStats usageStats : appList) { mySortedMap.put(usageStats.getLastTimeUsed(), usageStats); } if (mySortedMap != null && !mySortedMap.isEmpty()) { currentApp = mySortedMap.get( mySortedMap.lastKey()).getPackageName(); } } } else { ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> tasks = am .getRunningAppProcesses(); currentApp = tasks.get(0).processName; } 

将这些权限添加到清单文件(第一个用于<API 21,第二个用于> = API 21)。

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

getRunningTasks()

此方法在API级别21中已弃用。 从LOLLIPOP开始,此方法不再适用于第三方应用程序 :引入以文档为中心的最近值可能会将个人信息泄漏给调用者。 为了向后兼容,它仍然会返回一小部分数据:至less是调用者自己的任务,还有可能是一些其他任务,比如家中已知不敏感的任务。

可用但不是最好的方法是使用可访问性。

在AndroidManifest xml文件中声明一个辅助function服务

 <service android:name=".MyAccessibilityService" android:label="@string/accessibility_service_label" android:permission="android.permission.BIND_ACCESSIBILITY_SERVICE" > <intent-filter> <action android:name="android.accessibilityservice.AccessibilityService" /> </intent-filter> <meta-data android:name="android.accessibilityservice" android:resource="@xml/accessibility_service_config" /> </service> 

accessibility_service_config.xml文件

 <accessibility-service xmlns:android="http://schemas.android.com/apk/res/android" android:description="@string/accessibility_service_desc" android:accessibilityEventTypes="typeAllMask" android:accessibilityFlags="flagDefault|flagIncludeNotImportantViews" android:accessibilityFeedbackType="feedbackSpoken" android:notificationTimeout="100" android:canRetrieveWindowContent="true" /> 

当窗口状态改变时存储活动名称

 public class MyAccessibilityService extends AccessibilityService{ public static String sActivityName; @Override public void onAccessibilityEvent(AccessibilityEvent event) { // TODO Auto-generated method stub if(event.getEventType() == AccessibilityEvent.TYPE_WINDOW_STATE_CHANGED){ Log.d("activitytest", "onAccessibilityEvent with window state changed"); sActivityName = event.getClassName().toString(); } } @Override public void onInterrupt() { // TODO Auto-generated method stub } } 

缺点是您需要让用户在“设置”中启用您的辅助function服务。

我创build了一个类,它使用/system/bin/toolbox命令来识别进程,然后标识可见的应用程序。 需要添加识别系统应用程序没有用户界面和Android发射器。

ProcessManager.java

尝试这个

 public static boolean isForeground(Context context) { ActivityManager manager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); List<ActivityManager.RunningAppProcessInfo> tasks = manager.getRunningAppProcesses(); if(tasks.isEmpty()) return false; for (ActivityManager.RunningAppProcessInfo task : tasks) { if(context.getPackageName().equalsIgnoreCase(task.processName)){ return task.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND; } } return false; }