Mon application dispose d'une barre d'action avec 3 onglets de fragment. Dans le deuxième fragment, j'enregistre et désenregistre un BroadcastReceiver. Je désenregistre le destinataire dans onPause
et l'enregistre dans onCreateView
et dans onResume
.
getActivity().registerReceiver(this.batteryInfoReceiver, new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
et
getActivity().unregisterReceiver(batteryInfoReceiver);
1) Est-il correct d'enregistrer deux fois le même récepteur (dans onCreateView et onResume)? (Est-il inoffensif?)
2) Suffit-il d’enregistrer le récepteur dans onResume?
Regardez cycle de vie de Fragments
:
onCreateView (): Le système appelle cela lorsqu'il est temps que le fragment dessine son interface utilisateur pour la première fois. Pour dessiner une interface utilisateur pour votre fragment, vous devez renvoyer une vue de cette méthode qui constitue la racine de la présentation de votre fragment. Vous pouvez renvoyer null si le fragment ne fournit pas d'interface utilisateur.
onResume (): Le fragment est visible dans l'activité en cours.
onPause (): C'est généralement à cet endroit que vous devez valider toute modification qui devrait être conservée au-delà de la session de l'utilisateur en cours (car l'utilisateur risque de ne pas revenir).
Conclusion:
Il est donc préférable d’inscrire le destinataire uniquement à l’intérieur de onResume()
et de désinscrire à l’intérieur de onPause()
car onCreateView()
traite uniquement de la hiérarchie des vues. Cela n'a rien à voir avec le récepteur. Donc, ce n’est pas nocif, mais c’est sûrement inutile.
J'espère que ça vous sera utile !!
Voici le code qui fonctionne pour moi:
Disposition intérieure:
<Button
Android:id="@+id/button2"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:onClick="sendInternalBroadcast"
Android:text="Broadcast"/>
Fragment Layout:
<?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>
à l'intérieur de l'activité principale:
public void sendInternalBroadcast(View view)
{
Intent intent = new Intent();
intent.setAction("com.codingbadly.stefanronnkvist.simplebroadcastreceiver.setup");
intent.putExtra("From", "sendInternalBroadcast");
sendBroadcast(intent);
}
Fragment:
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));
}
}
Bonne chance .. Stefan Ronnkvist
OnResume Register:
context.registerReceiver(receiver,IntentFilter(BroadCastAction.action_success))
onPause unRegister:
context.unregisterReceiver(mContactBroadCastReceiver);