全局大喇叭-广播机制

来源:互联网 发布:thinkphp cms开发案例 编辑:程序博客网 时间:2024/05/17 06:36

此博客若要转载,请注明出处
先给出源码地址,注意是BroadcastTest和BroadcastTest2,我的博客

  1. 广播的简介
  2. 广播的使用
  3. 源码分析

一、广播的简介

官方:
Android apps can send or receive broadcast messages from the Android system and other Android apps, similar to the publish-subscribe design pattern. These broadcasts are sent when an event of interest occurs. For example, the Android system sends broadcasts when various system events occur, such as when the system boots up or the device starts charging. Apps can also send custom broadcasts, for example, to notify other apps of something that they might be interested in (for example, some new data has been downloaded).

官方的意思很简单,跟郭神的《第一行代码》说的差不多,大致就是Android应用程序可以从系统或者其他应用程序发送和接受广播消息,类似于发布订阅设计模式,每个APP只对自己感兴趣的广播进行注册接收。


二、广播的简单使用

  1. 广播的一种分类:

    全局广播(系统广播):发出的广播可以被其他任何应用程序接收到,并且也可以接受到其他任何应用程序的广播

    本地广播:发出的广播只能在应用程序内部进行传递,广播接收器也只能接受来自本应用程序的广播

    一点点关系:由于系统广播的全局性,很容易引发安全性问题,因此才引入了本地广播机制。官方给出了一些安全的考虑

  2. 使用
    • 注册

静态注册: 通过在 AndroidManifest.xml 中注册对应的 receiver,并设置要监听的 action

<receiver     android:name=".MyBroadcastReceiver"     android:enabled="true"     android:exported="true">     <intent-filter android:priority="100">         <action android:name="com.example.hp.broadcasttest.MY_BROADCAST"/>     </intent-filter></receiver>

其中 MyBroadcastReceiver 为继承 BroadcastReceiver 的类,重写了 onReceiver 方法,并在 onReceiver方法中对广播进行处理。标签设置过滤器,接收指定 action 广播。静态注册方式的特点:不管该应用程序是否处于活动状态,都会进行监听。action 可以为自定义 action,也可以是系统自带的 action。

动态注册:动态注册是在程序中对 BroadcastReceiver 完成监听注册,也就是通过代码进行注册。

注意:在不使用广播时,一定要取消注册,官方说明:在onCreat注册,应当在onDestroy取消 ;在onResume注册,应当在onPause取消;一定不能再onSaveInstanceState(Bundle)中注册,because this isn’t called if the user moves back in the history stack。

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        mIntentFilter = new IntentFilter();        //添加广播想要监听的类型,监听网络状态是否发生变化        mIntentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");        mNetworkChangeReceiver = new NetworkChangeReceiver();        //注册广播        registerReceiver(mNetworkChangeReceiver, mIntentFilter);    @Override    protected void onDestroy() {        super.onDestroy();        //取消注册广播接收器        unregisterReceiver(mNetworkChangeReceiver);    }
  • 发送自定义广播

标准广播
通过context. sendBroadcast或者context. sendBroadcastAsUser发送给当前系统中所有注册的接受者,也就是只要注册了就会接收到

        Button saveButton = (Button) findViewById(R.id.send_button);        saveButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent("com.example.hp.broadcasttest.MY_BROADCAST");                //发送标准广播                sendBroadcast(intent);            }        });

有序广播
接收者按照优先级处理广播,并且前面处理广播的接受者可以中止广播的传递,一般通过context. sendOrderedBroadcast或者context.sendOrderedBroadcastAsUser;

        Button saveButton = (Button) findViewById(R.id.send_button);        saveButton.setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                Intent intent = new Intent("com.example.hp.broadcasttest.MY_BROADCAST");                //发送有序广播                sendOrderedBroadcast(intent, null);            }        });

两者的区别:从代码中可见两者并没有什么太大的区别,就只是改动了一行代码而已。
当然,详细的可以见这篇博客android有序广播和无序广播的区别。

粘性广播
可以发送给以后注册的接受者,意思是系统会将前面的粘性广播保存在AMS中,一旦注册了与以保存的粘性广播符合的广播,在注册结束后会立即收到广播,一般通过context. sendStickyBroadcast或context.sendStickyOrderedBroadcast来发送,从字面上看,可以看出来粘性广播也分为普通粘性广播和有序粘性广播。
别人的博客android Application Component研究之BroadcastReceiver

此处由于没有过多的接触和了解,就没有写代码,欢迎了解的大神指教

  • 接收

接受的时候新建一个类,继承自BroadcastReceiver,并重写onReceice方法就行了,逻辑就在onReceive中进行处理

public class MyBroadcastReceiver extends BroadcastReceiver {    public MyBroadcastReceiver() {    }    @Override    public void onReceive(Context context, Intent intent) {        // TODO: This method is called when the BroadcastReceiver is receiving        // an Intent broadcast.        Toast.makeText(context, "received", Toast.LENGTH_SHORT).show();        //将这条广播截断//        abortBroadcast();    }}

源码分析

具体分析博主就不给大家细说了,毕竟博主也在学习,在此把思维导图放上,边看思维导图,边看下面几篇博客应该就差不多了,毕竟Broadcast相对于Activity和Service来说要简单许多,特别是在看多Activity和Service的源码后,很多都有共同点

Android广播机制详解
Android广播机制实现源码浅析(一)
Android广播机制实现源码浅析(二)
Android广播机制实现源码浅析(三)
Android开发艺术探索
如果这张导图可以直接访问的话

特别鸣谢

第一行代码
Android开发艺术探索
图解 Android 广播机制
Android总结篇系列:Android广播机制
Android广播机制详解
Android广播机制实现源码浅析(一)
Android广播机制实现源码浅析(二)
Android广播机制实现源码浅析(三)

原创粉丝点击