web-dev-qa-db-fra.com

Enregistrement et désinscription de BroadcastReceiver dans un fragment

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?

61
Katrinna L

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 !!

134
Mehul Joisar

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

8
Stefan Ronnkvist

OnResume Register:

context.registerReceiver(receiver,IntentFilter(BroadCastAction.action_success))

onPause unRegister:

context.unregisterReceiver(mContactBroadCastReceiver);
1
Pradeep Bishnoi