Deseo tener una aplicación que se ejecute en segundo plano, que sepa cuándo se está ejecutando alguna de las aplicaciones integradas (mensajería, contactos, etc.).
Entonces mis preguntas son:
Cómo debo ejecutar mi aplicación en segundo plano.
Cómo mi aplicación en segundo plano puede saber cuál es la aplicación que se está ejecutando actualmente en primer plano.
Las respuestas de personas con experiencia serán muy apreciadas.
Respuestas:
Con respecto a "2. Cómo mi aplicación en segundo plano puede saber cuál es la aplicación que se está ejecutando actualmente en primer plano".
NO use el
getRunningAppProcesses()
método ya que esto devuelve todo tipo de basura del sistema de mi experiencia y obtendrá múltiples resultados que tienenRunningAppProcessInfo.IMPORTANCE_FOREGROUND
. Utilizar en sugetRunningTasks()
lugarEste es el código que utilizo en mi servicio para identificar la aplicación en primer plano actual, es realmente fácil:
Eso es todo, luego puede acceder fácilmente a los detalles de la aplicación / actividad en primer plano:
Esto requiere un permiso adicional en menifest de actividad y funciona perfectamente.
fuente
getRunningTasks()
está en desuso en API 21 (Lollipop) - developer.android.com/reference/android/app/…Tuve que encontrar la solución correcta por las malas. el siguiente código es parte de cyanogenmod7 (los ajustes de la tableta) y se prueba en Android 2.3.3 / gingerbread.
métodos:
con suerte, esto responde a este problema en toda extensión (:
fuente
mActivityManager.getRunningTasks(1).get(0).topActivity
?Prueba el siguiente código:
El nombre del proceso es el nombre del paquete de la aplicación que se ejecuta en primer plano. Compárelo con el nombre del paquete de su aplicación. Si es el mismo, entonces su aplicación se está ejecutando en primer plano.
Espero que esto responda tu pregunta.
fuente
Desde piruleta en adelante, esto cambió. Encuentre el código a continuación, antes de que el usuario tenga que ir a Configuración -> Seguridad -> (Desplácese hacia abajo hasta el último) Aplicaciones con acceso de uso -> Otorgue los permisos a nuestra aplicación
fuente
Para los casos en los que necesitamos verificar desde nuestro propio servicio / hilo de fondo si nuestra aplicación está en primer plano o no. Así es como lo implementé y funciona bien para mí:
Ahora para verificar desde otras clases, si la aplicación está en primer plano o no, simplemente llame a:
Actualización (como señaló SHS ):
No olvide registrarse para las devoluciones de llamada en el
onCreate
método de su clase de aplicación .fuente
Para determinar la aplicación de primer plano, puede usar para detectar la aplicación de primer plano, puede usar https://github.com/ricvalerio/foregroundappchecker . Utiliza diferentes métodos según la versión de Android del dispositivo.
En cuanto al servicio, el repositorio también proporciona el código que necesita para ello. Esencialmente, deje que Android Studio cree el servicio por usted y luego onCreate agregue el fragmento que usa appChecker. Sin embargo, necesitará solicitar permiso.
fuente
Teniendo en cuenta que
getRunningTasks()
está obsoleto ygetRunningAppProcesses()
no es confiable, tomé la decisión de combinar 2 enfoques mencionados en StackOverflow:fuente
El ActivityManager clase es la herramienta adecuada para ver qué procesos se están ejecutando.
Para ejecutar en segundo plano, normalmente desea utilizar un servicio .
fuente
Esto funcionó para mí. Pero solo da el nombre del menú principal. Es decir, si el usuario ha abierto Configuración -> Bluetooth -> Pantalla de nombre del dispositivo, RunningAppProcessInfo lo llama simplemente Configuración. No se puede profundizar más
fuente
Haz algo como esto:
fuente
En piruleta y más:
Agregar a mainfest:
Y haz algo como esto:
fuente
Así es como verifico si mi aplicación está en primer plano. Tenga en cuenta que estoy usando AsyncTask como lo sugiere el Android oficial documentación
'
y ejecute AsyncTask así.
new CheckIfForeground().execute();
fuente
Combiné dos soluciones en un método y me funciona para API 24 y API 21. Otras no las probé.
El código en Kotlin:
y en manifiesto
fuente