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.
- Repetir alarmas cada lunes en Android usig AlarmManager / BroadcastReceiver
- Difusión en contacto agregar / cambiar?
- SMS reciben sin notificación
- Google Analytics para Android v2 Seguimiento de campaña no funciona
- Android captura nueva llamada saliente
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(); }
- ¿Cómo detener / cancelar el administrador de alarmas en otra actividad?
- Android AlarmManager en un Broadcastreceiver
- Enviar datos al correo electrónico en el fondo
- Cómo obtener un Broadcastreceiver fiable
- BroadcastReceiver ClassNotFound Exception
- ¿Cómo cancelar la notificación de difusión? (Para una emisión no ordenada)
- Receptor de difusión para llamadas perdidas en android
- La notificación no se elimina al hacer clic en el botón de acción incluso después de proporcionar el ID de notificación
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
- Enviar datos desde Arduino a la aplicación para Android mediante Bluetooth
- VideoView no reproduce vídeo en bucle solo en Galaxy s4