ResultReceiver no sobrevive a la rotación de la pantalla

Estoy implementando un cliente REST en Android. He visto un ejemplo de uso de un Service para realizar la conexión con el servidor y el ResultReceiver para ser notificado de la finalización de la operación. Estoy llamando al servicio de un fragmento y, si intento girar la pantalla mientras el servicio está funcionando, el método getActivity () en ResultReceiver devuelve nulo porque probablemente ese fragmento ya no está en el diseño.

El método de devolución de llamada en el fragmento:

 @Override public void onReceiveResult(int resultCode, Bundle resultData) { Response response = (Response) resultData .getSerializable(RestService.RESULT); if (resultCode == RestService.SUCCESS && response != null) { if (getActivity() != null) { recommendationResponse = response; getLoaderManager().restartLoader(0, new Bundle(), Fragment.this); } } } 

getActivity() devuelve null. ¿Esto es normal? ¿Qué enfoque podría utilizar para permitir la notificación incluso en la rotación de la pantalla? Difusión local?

4 Solutions collect form web for “ResultReceiver no sobrevive a la rotación de la pantalla”

No,

 android:configChanges="orientation" 

No es una solución.

Para usar ResultReceiver I:

  • Guárdelo en los cambios de orientación:

     @Override public void onSaveInstanceState(Bundle outState) { outState.putParcelable(Consts.RECEIVER, mReceiver); super.onSaveInstanceState(outState); } 
  • Reinicie el receptor:

     @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { if (savedInstanceState != null) { mReceiver = savedInstanceState.getParcelable(Consts.RECEIVER); } else { mReceiver = new MyResultReceiver(new Handler()); } mReceiver.setReceiver(this); } 

Aquí está mi clase de ResultReceiver:

 import android.os.Bundle; import android.os.Handler; import android.os.ResultReceiver; public class MyResultReceiver extends ResultReceiver { private Receiver mReceiver; public MyResultReceiver(Handler handler) { super(handler); } public void setReceiver(Receiver receiver) { mReceiver = receiver; } public interface Receiver { public void onReceiveResult(int command, Bundle resultData); } @Override protected void onReceiveResult(int command, Bundle resultData) { if (mReceiver != null) { mReceiver.onReceiveResult(command, resultData); } } } 

Estoy utilizando un BroadcastReceiver registrado usando LocalBroadcastManager y está funcionando correctamente. No fue tan simple. ¿Existe una solución mejor?

Creo que tropecé con el mismo problema y lo resolvió mediante la verificación de NULL en el método onReceivedResult de mi ResultReceiver. El código publicado aquí funciona en un fragmento de trabajador (fragmento sin UI y setRetainInstance (true) en onCreate)

 protected void onReceiveResult(int resultCode, Bundle resultData) { //Verify activity if(getActivity() != null){ //Handle result }else{ notificationPending = true; } } 

Los indicadores notificationPending ayudan al fragmento a retener la notificación pendiente si la actividad no se ha encontrado (la actividad no está disponible en el fragmento Desvincular).

Cuando el fragmento se vuelve a conectar a la actividad i realizar esta lógica

 public void onAttach(Activity activity){ super.onAttach(activity); if(notificationPending){ //Handle notification notificationPending = false; } } 

Espero eso ayude. Puede pedir más detalles si lo desea. Aclamaciones

GetActivity () devuelve null. ¿Esto es normal?

Las actividades de Android se recrean después de la rotación del dispositivo.

Después de que la actividad se recrea, no tiene el contexto antiguo. Por eso tu get getActivity() como null

¿Qué enfoque podría utilizar para permitir la notificación incluso en la rotación de la pantalla? Difusión local?

Si usted no quiere actividad recreada en la rotación de la pantalla. Mención siguiente en el manifiesto

  <activity android:name=".MyActivity" android:configChanges="orientation" <<<<<<<<< android:label="@string/app_name" android:screenOrientation="portrait" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

Y por último tendrá que anular los siguientes en Actividad.

 @Override public void onConfigurationChanged(Configuration newConfig) { // TODO Auto-generated method stub super.onConfigurationChanged(newConfig); } 
  • Android - Ejecutar en segundo plano - Service vs. standard java class
  • Detectar el evento "botón de inicio presionado" en el servicio android que muestra una interfaz de usuario (similar a los cabezales de chat de Facebook)
  • Cómo saber si el usuario está en la pantalla de bloqueo desde el servicio
  • Grabar sonido Y reproducir sonido modulado En Android?
  • Actualización de Textview en una actividad con servicio local
  • Lanzar una excepción personalizada de un servicio a una actividad
  • Android detecta el estado táctil desde cualquier aplicación
  • Servicio de ejecución en el fondo?
  • En Android: ¿Cómo llamar a la función de la actividad de un servicio?
  • Acceda a Running service y llame a su método?
  • Google Cloud Messaging - GCM - SERVICE_NOT_AVAILABLE
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.