web-dev-qa-db-ja.com

BroadcastReceiverをフラグメントに登録および登録解除する

私のアプリには、3つのフラグメントタブがあるアクションバーがあります。 2番目のフラグメントでは、BroadcastReceiverを登録および登録解除します。 onPauseでレシーバーの登録を解除し、onCreateViewおよびonResumeで登録します。

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

そして

getActivity().unregisterReceiver(batteryInfoReceiver);

1)同じ受信者を2回(onCreateViewとonResumeで)登録しても大丈夫ですか?(無害ですか?

2)受信者をonResumeに登録するだけで十分ですか?

61
Katrinna L

Fragmentslife-cycle を見てください:

onCreateView():フラグメントがユーザーインターフェイスを初めて描画するとき、システムはこれを呼び出します。フラグメントのUIを描画するには、フラグメントのレイアウトのルートであるこのメソッドからビューを返す必要があります。フラグメントがUIを提供しない場合、nullを返すことができます。

onResume():フラグメントは実行中のアクティビティに表示されます

onPause():これは通常、現在のユーザーセッションを超えて永続化する必要がある変更をコミットする場所です(ユーザーが戻ってこない可能性があるため)。

結論:

onResume()はビュー階層を処理するため、onPause()内でのみレシーバーを登録し、onCreateView()内で登録解除することをお勧めしますのみ。受信機とは関係ありません。したがって、有害ではありませんが、確かに役に立たないのです。

お役に立てばと思います!!

134
Mehul Joisar

ここに私のために働くコードがあります:

内部レイアウト:

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

フラグメントレイアウト:

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

メインアクティビティ内:

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

断片:

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

幸運..ステファン・ロンクビスト

8

OnResume Register:

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

onPause unRegister:

context.unregisterReceiver(mContactBroadCastReceiver);
1
Pradeep Bishnoi