在片段中注册和取消注册BroadcastReceiver

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在片段中注册和取消注册BroadcastReceiver相关的知识,希望对你有一定的参考价值。

我的应用有一个带有3个片段标签的操作栏。在第二个片段中,我注册并取消注册BroadcastReceiver。我在onPause取消注册接收器,并在onCreateViewonResume中注册。

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

getActivity().unregisterReceiver(batteryInfoReceiver);

1)两次注册相同的接收器是否可以(在onCreateView和onResume上)?(它是无害的吗?)

2)仅在onResume中注册接收器是否足够?

答案

看看life-cycleFragments

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

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

onPause():这通常是您应该提交应该在当前用户会话之外保留的任何更改的地方(因为用户可能不会回来)。

结论:

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

我希望它会有所帮助!!

另一答案

这是适用于我的代码:

内部布局:

<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

另一答案

OnResume注册:

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

onPause unRegister:

context.unregisterReceiver(mContactBroadCastReceiver);

以上是关于在片段中注册和取消注册BroadcastReceiver的主要内容,如果未能解决你的问题,请参考以下文章

片段未在后台堆栈中注册

碎片一个接一个

带有固定按钮的片段

取消注册和重新注册 GCM 消息会导致两个 regId 有效。这是预期的吗?

Dos命令注册,取消注册DLL文件

Azure 通知中心和 Apple APNS 推送通知取消注册设备