Android 5.1.1 y superior: getRunningAppProcesses () solo devuelve el paquete de mi aplicación

Parece que Google finalmente cerró todas las puertas para obtener el paquete de aplicación actual en primer plano.

Después de la actualización de Lollipop, que matógetRunningTasks(int maxNum) y gracias aesta respuesta, Usé este código para obtener el paquete de la aplicación en primer plano desde Lollipop:

final int PROCESS_STATE_TOP = 2;
RunningAppProcessInfo currentInfo = null;
Field field = null;
try {
    field = RunningAppProcessInfo.class.getDeclaredField("processState");
} catch (Exception ignored) { 
}
ActivityManager am = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
List<RunningAppProcessInfo> appList = am.getRunningAppProcesses();
for (RunningAppProcessInfo app : appList) {
    if (app.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND &&
        app.importanceReasonCode == 0 ) {
        Integer state = null;
        try {
            state = field.getInt( app );
        } catch (Exception ignored) {
        }
        if (state != null && state == PROCESS_STATE_TOP) {
            currentInfo = app;
            break;
        }
    }
}
return currentInfo;

Android 5.1.1 y superior (6.0 Marshmallow), al parecer, asesinadogetRunningAppProcesses() también. Ahora devuelve una lista de su propio paquete de aplicación.

UsageStatsManager

Podemos usar el nuevoUsageStatsManager API comodescrito aquí pero no funciona para todas las aplicaciones. Algunas aplicaciones del sistema devolverán el mismo paquete

com.google.android.googlequicksearchbox

Servicio de accesibilidad (Diciembre de 2017: Prohibido su uso por Google)

Algunas aplicaciones usanAccessibilityService (comovisto aquí) pero tiene algunas desventajas.

¿Hay alguna otra forma de obtener el paquete actual de la aplicación en ejecución?

Respuestas a la pregunta(7)

Su respuesta a la pregunta