No se puede obtener el receptor cuando se desinstala la aplicación

Me refiero a esta información.

Escribo el mismo programa, pero no puedo obtener ninguna información de registro cuando hago clic en el botón de desinstalación.

Adjunto mi código a continuación. ¿Alguien sabe cuál es el problema en este código?

Quiero hacer algo cuando el uso haga clic en botón de desinstalación. Tal vez como activar navegador, etc.

¿Alguien me puede dar una mano?

El problema me ha confundido durante mucho tiempo.

Mi AndroidManifest:

<uses-permission android:name="android.permission.GET_TASKS" /> <uses-permission android:name="android.permission.RESTART_PACKAGES"/> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <receiver android:name=".UninstallIntentReceiver" > <intent-filter> <action android:name="android.intent.action.QUERY_PACKAGE_RESTART" /> <action android:name = "android.intent.action.PACKAGE_REMOVED" /> <action android:name = "android.intent.action.PACKAGE_ADDED" /> <data android:scheme="package"></data> </intent-filter> </receiver> </application> 

Mi código de BroadcastReceiver abajo:

 public class UninstallIntentReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { String [] packageNames = intent.getStringArrayExtra("android.intent.extra.PACKAGES"); if(packageNames!=null){ for(String packageName: packageNames){ if(packageName!=null && packageName.equals("yu.idv.uninstalldetected")){ Log.i("info", "00000000"); new ListenActivities(context).start(); Log.i("info", "11111111"); } } } } } class ListenActivities extends Thread{ boolean exit = false; ActivityManager am = null; Context context = null; public ListenActivities(Context con){ context = con; am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE); } public void run(){ Looper.prepare(); while(!exit){ List< ActivityManager.RunningTaskInfo > taskInfo = am.getRunningTasks(MAX_PRIORITY); String activityName = taskInfo.get(0).topActivity.getClassName(); Log.i("info", "======CURRENT Activity =======::" + activityName); if (activityName.equals("com.android.packageinstaller.UninstallerActivity")) { exit = true; Log.i("info", "2222222222"); Toast.makeText(context, "Done with preuninstallation tasks... Exiting Now", Toast.LENGTH_SHORT).show(); } else if(activityName.equals("com.android.settings.ManageApplications")) { exit=true; Log.i("info", "33333333333"); } } Looper.loop(); } 

La razón por la que su BroadcastReceiver no se llama es que su aplicación sigue estando en "estado detenido". Su aplicación no tiene ningún componente de Activity . Esto significa que después de instalar la aplicación, no hay forma de que el usuario la inicie. Las aplicaciones que nunca han sido iniciadas por el usuario permanecer en el "estado detenido". Las aplicaciones en el "estado detenido" no recibirán Intenciones de difusión .

Consulte la sección sobre "Controles de inicio en aplicaciones detenidas" en http://developer.android.com/about/versions/android-3.1.html.


EDIT: Añada más detalles sobre Intent.ACTION_QUERY_PACKAGE_RESTART en Android 4.x

Parece que este comportamiento ha cambiado desde Android 2.3 (no estoy seguro acerca de Android 3.x). En Android 4.0 o superior, el código de InstalledAppDetails (parte de la aplicación Configuración) tiene este aspecto:

  private void checkForceStop() { if (mDpm.packageHasActiveAdmins(mPackageInfo.packageName)) { // User can't force stop device admin. updateForceStopButton(false); } else if ((mAppEntry.info.flags&ApplicationInfo.FLAG_STOPPED) == 0) { // If the app isn't explicitly stopped, then always show the // force stop button. updateForceStopButton(true); } else { Intent intent = new Intent(Intent.ACTION_QUERY_PACKAGE_RESTART, Uri.fromParts("package", mAppEntry.info.packageName, null)); intent.putExtra(Intent.EXTRA_PACKAGES, new String[] { mAppEntry.info.packageName }); intent.putExtra(Intent.EXTRA_UID, mAppEntry.info.uid); getActivity().sendOrderedBroadcast(intent, null, mCheckKillProcessesReceiver, null, Activity.RESULT_CANCELED, null, null); } } 

Por lo tanto, si la aplicación que se muestra es un admin de dispositivo, el botón de "parada de fuerza" se deshabilitará. Si la aplicación que se muestra no se detiene , entonces se activará el botón de "parada de fuerza". De lo contrario, Intent.ACTION_QUERY_PACKAGE_RESTART se emitirá.

Esto significa que el Intent sólo se emitirá para las aplicaciones que no estén en el dispositivo y que ya estén detenidas.

He probado esto en un dispositivo 4.0 con su código. Si instala su aplicación, entonces vaya a Settings->Apps y elija otra aplicación (no la suya) que ha sido "detenida por la fuerza", su onReceive() se llama con Intent.ACTION_QUERY_PACKAGE_RESTART .

Me di cuenta de esto probablemente no es mucha ayuda, pero al menos explica el comportamiento que está viendo.

Lo siento que tomó tanto tiempo para resolver esto, y gracias por el reto 🙂

Generalmente, cuando se desinstala la aplicación, se eliminan todos los recursos del dispositivo. Por lo que no puede activar ninguna acción en el momento de la desinstalación

  • Actividad abierta dos veces
  • ¿Qué es más eficiente Broadcast Receiver o Handler?
  • Escuchar el acceso a la ubicación desactivar / activar en la configuración
  • Ampliar broadcastreceptor y seguimiento de Google Analytics INSTALL_REFERRER
  • Cómo detectar los eventos de MediaPlayer de youtube desde un servicio
  • Actividad lanzada desde receptor de difusión, mantiene en tareas recientes a pesar de haber sido terminado
  • SMS BroadCast Receptor recibe muchas veces?
  • Intentando iniciar un servicio de inicio en Android
  • BOOT_COMPLETED no funciona en Android
  • No se puede instanciar el receptor java.lang.ClassNotFoundException
  • AlarmManager dentro de BroadcastReceiver cuando BOOT_COMPLETED
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.