OnCreate () se llama cuando se vuelve a abrir desde una tarea reciente después de cambiar la configuración del permiso

El título de la pregunta puede sonar complicado pero aquí está mi situación.

Tengo un fragmento de mapa dentro de una actividad. Sencillo. Activar el permiso de almacenamiento para permitir la visualización de mapa, funciona bien. Fondos de la aplicación mediante el botón Inicio, a continuación, desactive el permiso de almacenamiento y abra la aplicación de la tarea reciente, la aplicación se bloquea.

El problema es en lugar de llamar onResume () de la actividad del host, onCreate () se llama en la actividad del host, así como onCreateView () del fragmento de mapa. Así está lanzando Excepciones.

Parece que el proceso de la aplicación se pierde cuando se cambia el permiso y, por tanto, se recrea la actividad.

09-24 14:42:55.071: E/AndroidRuntime(12918): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 09-24 14:42:55.071: E/AndroidRuntime(12918): Caused by: java.lang.NullPointerException: Attempt to write to field 'int android.support.v4.app.Fragment.mNextAnim' on a null object reference 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.BackStackRecord.run(BackStackRecord.java:718) 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentManagerImpl.execPendingActions(FragmentManager.java:1489) 09-24 14:42:55.071: E/AndroidRuntime(12918): at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:548) 

Desde super.onStart () de la Actividad

La solución viable ahora es simplemente llamar a getSupportFragmentManager().popBackStackImmediate(); In onCreate () de la Actividad para evitar que se intente recrear el fragmento de mapa.

PopBackStack () no funcionará en este caso, ya que es asíncrono.

Probablemente un poco tarde, todavía podría ayudar a otros en el futuro 🙂

Debería comprobar si savedInstanceState es null que se pasa a onCreate(Bundle savedInstanceState) . Si sólo es null , inicie el Fragment manera:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_layout_file); if (savedInstanceState == null) { // do fragment transactions here } } 

Estaba teniendo problemas similares con el cambio dinámico en el permiso de la aplicación. Después de algunos cavar lo que entendí podría ser útil para usted también.

Cambiar el permiso causa la terminación de su aplicación por el sistema y ahora si abre su aplicación desde la pantalla de resumen, se reiniciará su aplicación, que es la razón principal de su bloqueo, ya que podría estar realizando una operación en el objeto fragmento, que es nulo ahora .

Un punto importante a destacar aquí es que antes de que el estado del fragmento de terminación se guarde en el objeto savedinstance.

Para detener el bloqueo debe obtener instancia de fragmento utilizando esta línea de código –

 mapFragment = (MapFragment)getSupportFragmentManager().findFragmentByTag("MAP FRAG"); 

Aquí "MAP FRAG" es una etiqueta que tienes que dar a tu fragmento.

Compartir si tienes alguna confusión.

  • Mostrar explicación de permiso de forma asincrónica
  • Permiso personalizado con intención implícita
  • ¿Cómo encontrar los permisos requeridos de tiempo de ejecución de Marshmallow de Android en el código?
  • Solicitar permiso en Android M sólo cuando se apunta a una API inferior
  • Java.lang.SecurityException: bloqueo de permisos de BLUETOOTH. (Sólo dispositivos Samsung)
  • Explorando checkCallingOrSelfPermission () para el ataque de escalado de privilegios
  • Permiso denegado (¿falta el permiso de INTERNET?): Pero se da permiso
  • Grant Uri permiso para otra actividad
  • Permitir permiso de tiempo de ejecución múltiple
  • ¿Por qué Google reproduce ocultar android.permission.VIBRATE para algunas aplicaciones?
  • ActivityManager <user-permission> permiso no funciona
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.