ejemplos - broadcastreceiver android studio español
Registro y anulación del registro de BroadcastReceiver en un fragmento (3)
Mi aplicación tiene una barra de acción con 3 pestañas de fragmentos. En el segundo fragmento, registro y elimino el registro de un BroadcastReceiver. onPause
registro en onPause
y lo registro en onCreateView
y 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) ¿Es suficiente registrar el receptor en onResume?
Aquí hay un 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"/>
Diseño de Fragmento:
<?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>
dentro de la 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
Eche un vistazo al life-cycle de life-cycle de los 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 UI para su fragmento, debe devolver una Vista desde este método que es la raíz del diseño de su fragmento. Puede devolver nulo si el fragmento no proporciona una IU.
onResume (): el fragmento es visible en la actividad de ejecución
onPause (): generalmente es donde debe confirmar cualquier cambio que deba mantenerse más allá de la sesión de usuario actual (porque es posible que el usuario no regrese).
Conclusión:
Por lo tanto, es mejor registrar el receptor solo dentro de onResume()
y anular el registro dentro de onPause()
porque onCreateView()
trata con la jerarquía de vistas. No tiene nada que ver con el receptor. Entonces no es dañino, pero seguramente es inútil.
¡¡Espero que sea util!!
Registro OnResume:
context.registerReceiver (receptor, IntentFilter (BroadCastAction.action_success))
onPause unRegister:
context.unregisterReceiver (mContactBroadCastReceiver);