que lollipop index documentacion develop android android-5.0-lollipop activity-manager

index - No se puede obtener el nombre de la actividad de primer plano solo en Android Lollipop 5.0



documentacion android (7)

Uso el siguiente código para obtener el nombre de la actividad de la aplicación en primer plano en la variable foregroundTaskPackageName . Funciona en todas las versiones de SO entre 4.1 y 4.4, pero no funciona en Android 5.0 Lollipop.

¿Alguien puede ayudar con lo que ha cambiado en 5.0 Lollipop? En Lollipop: el texto que obtengo para foregroundTaskPackageName es simplemente ''Launcher3''. Estoy usando el emulador 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();


Esto me funciona en Lollipop (21):

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


He creado una clase que usa el comando /system/bin/toolbox para identificar procesos y luego identifica la aplicación visible. La necesidad de agregar identifica las aplicaciones del sistema sin interfaz de usuario y lanzadores de Android.

ProcessManager.java


Prueba esto

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; }


Una forma disponible, pero no la mejor, es usar la accesibilidad.

Declarar un servicio de accesibilidad en el archivo xml de AndroidManifest

<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 file

<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" />

almacenar el nombre de la actividad cuando el estado de la ventana cambia

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 } }

La desventaja es que debe permitir que los usuarios habiliten su servicio de accesibilidad en Configuración.


puede utilizar el código de abajo y obtener el nombre del paquete de actividad de primer plano actual.

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; }

Agregue estos permisos al archivo de manifiesto (el primero es para <API 21, el segundo para> = API 21).

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


getRunningTasks()

Este método estaba en desuso en el nivel 21 de API. A partir de LOLLIPOP, este método ya no está disponible para aplicaciones de terceros : la introducción de registros recientes centrados en el documento significa que puede filtrar información personal a la persona que llama. Para la compatibilidad con versiones anteriores, aún devolverá un pequeño subconjunto de sus datos: al menos las tareas propias de la persona que llama, y ​​posiblemente algunas otras tareas, como el hogar, que se sabe que no son sensibles.


UsageStatsManager usar el nuevo UsageStatsManager y llamar a su método queryUsageStats para obtener el historial de actividades iniciadas. Tenga en cuenta que el usuario deberá proporcionar acceso a las estadísticas de uso en la configuración del dispositivo en Seguridad-> Aplicaciones con acceso de uso.

Campo de golf:

Documentación de UsageStatsManager

queryUsageStats método queryUsageStats