Recibir paquetes de instalación y desinstalación de eventos

Intento detectar cuándo se está instalando una nueva aplicación, pero solo si mi aplicación se está ejecutando. Logré detectar la instalación de la aplicación haciendo un BroadcastReceiver y activándolo dentro del archivo AndroidManifest pero esto detectará incluso si mi aplicación está cerrada. Es por eso que necesito activar y desactivar manualmente el transmisorveveiver. Para hacer esto tengo este código:

br = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { // TODO Auto-generated method stub Log.i("Enter", "Enters here"); Toast.makeText(context, "App Installed!!!!.", Toast.LENGTH_LONG).show(); } }; IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL); registerReceiver(br, intentFilter); 

Esto debería hacer un brindis cuando se instala una nueva aplicación. Pero lamentablemente no es así. No ingresa en el método onReceive. Cualquier ayuda es apreciada.

Intenté registrar BroadcastReceiver en el archivo de manifiesto o en el código de Java. Pero onReceive() de estos dos métodos desencadenó el método onReceive() . Después de buscar en Google este problema, encontré una solución para ambos métodos de otra aplicación Thread in SO: Android Notification

En el archivo de manifiesto:

        

En código java:

 IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(Intent.ACTION_PACKAGE_ADDED); intentFilter.addAction(Intent.ACTION_PACKAGE_INSTALL); intentFilter.addDataScheme("package"); registerReceiver(br, intentFilter); 

Esto debería funcionar para ti.

Solo para agregar a la respuesta anterior de Huang, aquí se muestra cómo obtener el nombre del paquete de la aplicación recién instalada:

 public class YourReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { String packageName = intent.getData().getEncodedSchemeSpecificPart(); } } 

Otras respuestas apuntan a escuchar ACTION_PACKAGE_ADDED de ACTION_PACKAGE_ADDED y ACTION_PACKAGE_REPLACED . Eso está bien para Android 7.1 y versiones anteriores. En Android 8.0+, no puede registrarse para esas transmisiones en el manifiesto.

En su lugar, debe llamar getChangedPackages() en PackageManager periódicamente, por ejemplo, a través de un trabajo JobScheduler periódico. Esto no le dará resultados en tiempo real, pero los resultados en tiempo real ya no son una opción en Android 8.0+.