it-swarm.com.de

Registrieren und Aufheben der Registrierung von BroadcastReceiver in einem Fragment

Meine App hat eine Aktionsleiste mit 3 Fragment-Registerkarten. Im zweiten Fragment registriere ich einen BroadcastReceiver und hebe die Registrierung auf. Ich melde den Empfänger in onPause ab und melde ihn in onCreateView und in onResume an.

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

und

getActivity().unregisterReceiver(batteryInfoReceiver);

1) Ist es in Ordnung, denselben Empfänger zweimal zu registrieren (in onCreateView und onResume)? (Ist es harmlos?)

2) Reicht es aus, den Empfänger nur in onResume zu registrieren?

61
Katrinna L

Schauen Sie sich Lebenszyklus von Fragments an:

onCreateView (): Das System ruft dies auf, wenn das Fragment zum ersten Mal seine Benutzeroberfläche zeichnen soll. Um eine Benutzeroberfläche für Ihr Fragment zu zeichnen, müssen Sie eine Ansicht von dieser Methode zurückgeben, die der Stamm des Layouts Ihres Fragments ist. Sie können null zurückgeben, wenn das Fragment keine Benutzeroberfläche bereitstellt.

onResume (): Das Fragment ist in der laufenden Aktivität sichtbar

onPause (): Hier sollten Sie normalerweise alle Änderungen festschreiben, die über die aktuelle Benutzersitzung hinaus bestehen bleiben sollen (da der Benutzer möglicherweise nicht zurückkommt).

Fazit:

Es ist daher besser, den Empfänger nur innerhalb von onResume() zu registrieren und die Registrierung innerhalb von onPause() aufzuheben, da onCreateView() behandelt nur die Ansichtshierarchie. Es hat nichts mit dem Empfänger zu tun. Es ist also nicht schädlich, aber sicherlich nutzlos.

Ich hoffe es wird hilfreich sein !!

134
Mehul Joisar

Hier ist Code, der für mich funktioniert:

Innenlayout:

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

Fragmentlayout:

    <?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 Haupttätigkeit:

    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));
    }
}

Viel Glück .. Stefan Ronnkvist

8

OnResume Register:

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

onPause unRegister:

context.unregisterReceiver(mContactBroadCastReceiver);
1
Pradeep Bishnoi