Join FlipAndroid.COM Telegram Group: https://t.me/joinchat/F_aqThGkhwcLzmI49vKAiw


Registro y cancelación del registro de BroadcastReceiver en un fragmento

Mi aplicación tiene una barra de acción con 3 pestañas de fragmentos. En el segundo fragmento, registro y cancelo un BroadcastReceiver. onPause el registro del receptor en onPause y registrarlo en onCreateView y en onResume .

 getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED)); 

y

 getActivity().unregisterReceiver(batteryInfoReceiver); 

1) ¿Está bien registrar el mismo receptor dos veces (en onCreateView y onResume)? (¿Es inofensivo?)

2) ¿Basta con registrar el receptor en onResume?

  • No se puede depurar a través de onReceive () en el arranque completado receptor
  • AlarmManager, BroadcastReceiver y el servicio no funciona
  • ¿Por qué proguard procesa AndroidManifest.xml?
  • ¿Cómo inicio mi aplicación al inicio?
  • BroadcastReceiver permiso para el shell de adb
  • Android: la aplicación sin actividad de LAUNCHER no funciona
  • Cómo probar BOOT_COMPLETED receptor de emisión en emulador
  • SMS reciben sin notificación
  • 2 Solutions collect form web for “Registro y cancelación del registro de BroadcastReceiver en un fragmento”

    Echa un vistazo al ciclo de vida de Fragments :

    OnCreateView (): El sistema llama a esto cuando es hora de que el fragmento dibuje su interfaz de usuario por primera vez. Para dibujar una interfaz de usuario para su fragmento, debe devolver una vista de este método que es la raíz del diseño del fragmento. Puede devolver null si el fragmento no proporciona una interfaz de usuario.

    OnResume (): El fragmento es visible en la actividad en ejecución

    OnPause (): Normalmente es donde se deben confirmar los cambios que deben persistir más allá de la sesión de usuario actual (porque el usuario puede no volver).

    Conclusión:

    Por lo tanto, es mejor registrar el receptor sólo dentro de onResume() y anular el registro dentro de onPause() porque onCreateView() ocupa de la jerarquía de vistas. No tiene nada que ver con el receptor. Así que no es perjudicial, pero seguramente es inútil.

    ¡¡Espero que sea util!!

    Aquí está el código que funciona para mí:

    Diseño interior:

     <Button android:id="@+id/button2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:onClick="sendInternalBroadcast" android:text="Broadcast"/> 

    Fragmento Diseño:

      <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:gravity="center"> <TextView android:layout_height="wrap_content" android:layout_width="wrap_content" android:text="Fragment One" android:id="@+id/fragmentoneTextView1"/> </LinearLayout> 

    Inside Actividad principal:

      public void sendInternalBroadcast(View view) { Intent intent = new Intent(); intent.setAction("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"); intent.putExtra("From", "sendInternalBroadcast"); sendBroadcast(intent); } 

    Fragmento:

     import android.app.*; import android.content.*; import android.os.*; import android.view.*; import android.widget.*; public class FragmentOne extends Fragment { View view; Context _context; PendingIntent pi; BroadcastReceiver br; AlarmManager am; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { view = inflater.inflate(R.layout.fragmentone, container, false); setup(); return view; } @Override public void onAttach(Context context) { super.onAttach(context); _context = context; } @Override public void onDestroyView() { super.onDestroyView(); _context.unregisterReceiver(br); } private void setup() { br = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent i) { TextView tv = (TextView)view.findViewById(R.id.fragmentoneTextView1); tv.setText("onReceive"); } }; _context.registerReceiver(br, new IntentFilter("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup")); pi = PendingIntent.getBroadcast(_context, 0, new Intent("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup"), 0); am = (AlarmManager)(_context.getSystemService(Context.ALARM_SERVICE)); } } 

    Buena Suerte .. Stefan Ronnkvist

    FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.