Android开发经验谈

Android基础回顾(四)| 关于广播机制

2018-11-29  本文已影响14人  CCCode1997

参考书籍:《第一行代码》 第二版 郭霖
如有错漏,请批评指出!

广播机制简介

Android中的广播主要分两种类型:标准广播和有序广播

接收系统广播

Android内置了很多系统级别的广播,我们可以在应用程序中通过监听这些广播来得到各种系统的状态信息。使用广播接收器可以自由地对需要的广播进行注册,当有相应广播发出时,广播接收器就能够收到该广播,并对其进行逻辑处理。
注册广播的方式一般有两种:一是动态注册,即在代码中注册;二是静态注册,即在AndroidManifest文件中注册。
创建广播接收器的方法是新建一个类,继承BroadcastReceiver类,并重写onReceive()方法,当有广播到来时,onReceive()方法会被调用,我们可以在onReceive()方法中添加具体逻辑。

这样,我们的静态注册广播就完成了,具体结果自行验证。
注意:在onReceive()方法中不能进行耗时操作,因为广播接收器中不允许开启线程,若onReceive()方法运行较长时间,程序就会报错。

自定义广播

前面是关于如何使用广播接收器来接收系统广播,接下来我们来看看如何发送自定义广播。

使用本地广播

前面我们发送和接收的广播全部属于系统全局广播,即发出的广播可以被任何其他的应用程序接收到,并且也可以接受其他任何应用程序的广播。这样就很容易引起安全性问题。为此,Android引入了一套本地广播机制,使用本地广播机制,广播只能在应用程序内部进行传递,并且广播接收器也只会接收到应用程序内部的广播。
其实本地广播的用法和前面差不多,我们先来看代码:

public class BroadcastActivity extends AppCompatActivity {

    @BindView(R.id.but_send)
    Button send;

    LocalBroadcastManager manager;
    LocalReceiver localReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_broadcast);
        ButterKnife.bind(this);
        initView();
    }

    private void initView() {
        manager = LocalBroadcastManager.getInstance(this);
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction("com.laughter.broadcast.LOCAL_BROADCAST");
        localReceiver = new LocalReceiver();
        manager.registerReceiver(localReceiver, intentFilter);
    }

    @OnClick(R.id.but_send)
    public void send() {
        Intent intent = new Intent("com.laughter.broadcast.LOCAL_BROADCAST");
        manager.sendBroadcast(intent);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        manager.unregisterReceiver(localReceiver);
    }

    class LocalReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            ToastUtil.showShortToast(context, "received local broadcast");
        }
    }
}

和前面一样,我们首先定义一个内部类,即广播接收器,然后定义一个 LocalBroadcastManager 对象,通过它的 getInstance() 方法获取一个实例,接下来就是定义IntentFilter对象和广播接收器对象,给IntentFilter添加一条值为 com.laughter.broadcast.LOCAL_BROADCAST 的action,然后调用 LocalBroadcastManager 的 registerReceiver() 方法注册本地广播监听器,接下来在Button的点击事件中通过 LocalBroadcastManager 的 sendBroadcast() 方法发送广播,最后别忘了在onDestroy() 方法中取消注册。这样看起来,本地广播区别于全局广播的地方仅仅就是通过一个LocalBroadcastmanager 来管理广播的注册和发送。这样我们的广播就是仅仅在应用程序内部传递的了(感兴趣的自行验证)。
注意:既然需要通过 LocalBroadcastmanager 来管理广播的注册和发送,那么对应的静态注册的方式怎么实现呢?很遗憾,本地广播是无法通过静态注册的方式来接收的。不过仔细想想,本地广播的发送很显然是需要在应用程序启动的情况下完成的,既然要在应用程序启动的情况下发送广播,那么也不用考虑在应用程序未启动的情况下接收广播了。而我们使用静态注册主要就是为了在应用程序未启动的情况下也能收到广播,所以思路就很清晰了。


上一篇:Android基础回顾(三)| 关于Fragment
下一篇:Android基础回顾(五)| 数据存储——持久化技术


上一篇下一篇

猜你喜欢

热点阅读