转Android BroadcastReceiver介绍

Posted 神奇的旋风

tags:

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

本文主要介绍BroadcastReceiver的概念、使用、生命周期、安全性、分类、特殊的BroadcastReceiver(本地、粘性、有序、粘性有序广播)。
示例代码见BroadcastReceiverDemo,示例APK见:TrineaAndroidDemo.apk

 

1、概念介绍及两种注册方式的区别

BroadcastReceiver作为android四大组件之一,不像Activity,没有可显示的界面。BroadcastReceiver包括两个概念,广播发送者和广播接收者(Receiver),这里的广播实际就是指Intent,程序可以自己发送广播自己接收,也可以接受系统或其他应用的广播或是发送广播给其他应用程序。

发送者可以通过类似Context.sendBroadcast接口发送广播,接收者通过Context.registerReceiver()动态注册或在AndroidManifest.xml文件中通过<receiver>标签静态注册,注册完成后,当发送者发送某个广播时系统会将发送的广播(Intent)与系统中所有注册的符合条件的接收者(Receiver) 的IntentFilter进行匹配,若匹配成功则执行相应接收者的onReceive函数,匹配规则见Intent和IntentFilter的匹配规则。

关于registerReceiver动态注册和通过<receiver>标签静态注册广播的区别如下:

a.对bindService的调用,<receiver>注册的广播,在onReceive结束后广播即不存在,所以不能在其中给自己异步传递结果,如bindService而只能使用startService,如果想跟service交互可使用peekService。

b. 手动控制。registerReceiver为动态注册,自己可以手动注册或是取消注册;<receiver>标签为静态注册,由系统开机时自动扫描注册,所以无法手动控制,开机一直运行中。

c. 资源消耗不同。registerReceiver可以手动控制,所以适当的注册和取消注册能节省系统资源,<receiver>标签系统开机后一直有效。

d. 有效期不同。通过registerReceiver注册的BroadcastReceiver在对其进行注册的Context对象"销毁"了或者调用了unregisterReceiver方法时也就失效了,而通过<receiver>标签注册的BroadcastReceiver只要应用程序没有被删除就一直有效。

e. 对registerReceiver函数的调用许可不同。通过registerReceiver注册的BroadcastReceiver在其onReceive函数中可以再次调用某个Context的registerReceiver函数,而通过<receiver>标签注册的BroadcastReceiver不允许再调用某个Context的registerReceiver函数 。

f. 使用情况不同。对于自己发送和接受的广播可以通过registerReceiver注册,对于系统常用广播的接收通常用<receiver>标签注册。

 

2、使用举例

技术分享
技术分享
public class BroadcastReceiverDemo extends Activity {

    private final static String ACTION_SEND = "com.trinea.android.demo.BroadcastReceiverDemo.sendBroadcast";
    private final static String MSG_KEY     = "msg";

    private MyBroadcastReceiver receiver;
    private Button              sendBtn;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.broadcast_receiver_demo);

        receiver = new MyBroadcastReceiver();

        sendBtn = (Button)findViewById(R.id.sendBroadcast);
        sendBtn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                sendBtn.setText("发送中");
                sendBtn.setClickable(false);
                Intent i = new Intent(ACTION_SEND);
                i.putExtra(MSG_KEY, "好声音马上开始了啦");
                sendBroadcast(i);
            }
        });
    }

    @Override
    public void onPause() {
        super.onPause();
        unregisterReceiver(receiver);
    }

    @Override
    public void onResume() {
        super.onResume();
        registerReceiver(receiver, new IntentFilter(ACTION_SEND));
    }

    public class MyBroadcastReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            sendBtn.setText("发送广播");
            sendBtn.setClickable(true);
            Toast.makeText(context, intent.getStringExtra(MSG_KEY), Toast.LENGTH_SHORT).show();
        }
    }
}
技术分享

R.layout.broadcast_receiver_demo的内容为一个简单的id为sendBroadcast的Button 

从上面代码可以看到我们

a. 新建BroadcastReceiver只需要继承BroadcastReceiver并重写OnReceiver函数,加上自己的处理逻辑。

b. 通过registerReceiver注册广播,通过unregisterReceiver取消注册广播,通过sendBroadcast发送广播。

其中注册和取消注册广播放在了OnResume和OnPause函数中可以有效的节省系统消耗。如果希望广播一直运行中可以在Activity的OnCreate函数中注册,在OnDestrory函数中取消注册。

这里的MyBroadcastReceiver也可以在AndroidManifest.xml文件中静态注册,这样程序安装后便一直运行中。比如希望接收到短信到来时的广播,如下:

<receiver android:name="MyBroadcastReceiver">
    <intent-filter>
        <action android:name="android.provider.Telephony.SMS_RECEIVED" />
    </intent-filter>
</receiver>

以上是关于转Android BroadcastReceiver介绍的主要内容,如果未能解决你的问题,请参考以下文章

BroadcastReceive的使用

Android学习笔记--BroadcastReceiver

1.Android基本知识点

Android Activity生命周期的几个问题

Android:从 onReceive 方法设置新的警报

Android面试题解析美团/抖音/BATAndroid四大组件是什么