什么是广播?
广播:相当于iOS中的通知,给全局发送一个信息。所有对这条信息感兴趣的广播接收者对应做自己的处理逻辑。
广播接收者:接收广播的对象,一般是localReceiver类
广播种类
1.标准广播(Normal broadcast)
异步执行,效率高,无法被截断,所有的接收者同时接收到广播信息。2.有序广播(Ordered broadcast)
同步执行,效率低,可以被截断,同一时刻只能有一个广播接收者接收到信息,该接收者处理完毕自己的逻辑之后该广播才能继续传递,所以这是的广播接收者是有顺序的。优先级高的广播接收者优先收到广播信息。此时广播是被截断的。
广播的注册方式
静态注册和动态注册
静态注册:在AndroidManifest.xml文件中注册
动态注册:在代码注册
1.静态注册
注册方式:AndroidManifest.xml文件添加receiver标签
<receiver android:name=".ForceOfflineReceiver" >
<intent-filter>
<action android:name="com.example.broadcastbestpractice.FORCE_OFFLINE" />
</intent-filter>
</receiver>
静态注册特点:程序不需要启动就能进行注册和注销。(需要注意添加权限的声明)
- 2.动态注册
动态注册一般在onCreat()方法中进行广播注册。在广播接收者类(必须继承BroadcastReceiver类)中通过重写onReceive()方法。在该方法中进行逻辑处理。onReceive()方法不要执行耗时的操作,否则程序会报错。
注册方式
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
registerReceiver(new BroadcastReceiver(), intentFilter);
动态注册的广播接收者一定要在onDestroy()方法中通过调用** unregisterReceiver()**方法来取消注册。
动态注册特点:非常灵活,但是必须程序启动才能进行注册和注销。
自定义广播
自定义标准广播:
- 定义一个广播接收类,实现onReceive()方法。
- 在AndroidManifest.xml文件receiver标签添加自定义广播
<action android:name="com.example.broadcastbest.mybroadcast" />
- 在activity的onCreate()方法中发送广播
Button forceOffline = (Button) findViewById(R.id.force_offline);
forceOffline.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent("com.example.broadcastbest.mybroadcast");
sendBroadcast(intent);
}
});
发送有序广播
广播是一种跨进程的通信方式(接收系统广播就可以看出)
和标准广播的发送方式一样,只需要将activity中的sendBroadcast(intent)方法修改为sendOrderedBroadcast(intent, null)方法即可。由于有序广播是有顺序的,所以可以在receiver标签的intent-filter标签中追加priority属性,该属性是一个整数值,从而保证接收的顺序,onReceive()方法中调用abortBroadcast()方法,该广播会被截断。
本地广播
作用:
广播是可以横跨应用程序的,别的应用程序可以直接指定我们应用程序的广播名字来发送垃圾广播,从而会造成对程序的影响。一些关键私密的信息很可能会暴露。为了解决广播的安全问题,Android引入了本地广播机制,使用这个机制发送的广播只能在本地应用内部传递。实现方式:
通过localBroadcastManager类在注册和发送广播
通过localReceiver类来接收广播。-
好处
- 和全局广播相比更高效
- 安全性更高,保护本程序数据