76

我的应用程序有一个带有 3 个片段选项卡的操作栏。在第二个片段中,我注册和注销了一个 BroadcastReceiver。我取消注册接收器onPause并将其注册onCreateViewonResume.

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

getActivity().unregisterReceiver(batteryInfoReceiver);

1)两次注册同一个接收者可以吗(在onCreateView和onResume中)?(它是无害的吗?)

2) 只在 onResume 中注册接收者就足够了吗?

4

4 回答 4

150

看看生命周期Fragments

onCreateView(): 当片段第一次绘制其用户界面时,系统调用它。要为您的 Fragment 绘制 UI,您必须从此方法返回一个 View,它是 Fragment 布局的根。如果片段不提供 UI,您可以返回 null。

onResume(): 片段在正在运行的activity中可见

onPause(): 这通常是你应该提交任何应该在当前用户会话之外持久化的更改(因为用户可能不会回来)。

结论:

所以最好 只在内部注册接收器onResume()并在内部取消注册,onPause()因为onCreateView()只处理视图层次结构。它与接收器无关。所以它没有害处,但肯定是没用的。

我希望它会有所帮助!

于 2013-05-17T21:00:06.010 回答
16

这是对我有用的代码:

内部布局:

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

祝你好运.. Stefan Ronnkvist

于 2017-02-03T20:50:14.227 回答
4

OnResume 注册:

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

onPause 取消注册:

context.unregisterReceiver(mContactBroadCastReceiver);
于 2018-02-23T06:33:41.980 回答
2

使用 Fragment,在某些情况下,您最终会遇到异常Receiver not registered,例如我的情况。

为了解决这个问题,我使用了

 LocalBroadcastManager.getInstance(ctx).registerReceiver(myReceiver,IntentFilter(...))

代替

 activity.registerReceiver(paxAmountReceiver,IntentFilter(...))

与注销类似,使用 in onDestroyView()(For Eg.)

LocalBroadcastManager.getInstance(ctx).unregister(myReceiver)
于 2020-12-11T05:43:17.160 回答