广播的类型:
标准广播:完全异步执行的广播,这也意味着,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到广播消息,因此它们之间没有先后顺序可言,这种广播的效率会比较高,标准广播的流程图如下所示。图片来自第一行代码
有序广播:一种同步执行的广播,在广播发出之后,同一时刻只有一个广播接收器能够收到这条广播消息。当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。
1. 接收系统广播
Android内置了很多系统级别的广播,比如电池电量,时区时区、开关机、等状态变化时都可以发送系统广播。
- 广播接收器的简介
广播接收器可以自定义对某些广播进行注册,当收到注册的广播时能够在内部做相应的逻辑处理。
- 如何创建一个广播接收器:
新建一个类,让它继承自Broadcast-Receiver,并重写父类的onReceive()方法。这样当有广播进来的时,就会调用onRecevier()方法。
- 注册广播的方式:
- 在代码中注册:也称为动态注册,动态注册的广播接收器在处理完业务之后都要取消注册。
- 在AndroidManifest.xml中注册:也称为静态注册。
注:动态注册虽然灵活性高,但是需要在打开程序的情况下才可接收到广播。所以当需要实现开启启动时就需要用到静态注册了。另外在注册前都需要在配置文件中声明权限,否则直接崩溃
```
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.anwser_mac.broadcasttest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
```
- 使用广播的注意点
1.如果是静态注册广播的话需要在配置文件说明,如果是通过系统创建的话则系统会自动添加
<receiver
android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">
</receiver>
2.动态广播接收器在处理完业务之后要记得取消注册。 3.涉及系统权限的广播都要在配置文件做声明。 4.广播接收器中不允许开启线程,因此不能够在onReceiver()方法中处理过多逻辑或耗时操作,一般广播接收器扮演的是打开程序其他组件的角色,比如创建状态栏通知,或者启动一个服务。
2. 发送自定义的广播
2.1 发送标准广播
具体思路
- 新建一个类,继承自BroadcastReceiver,重写onReceive()方法
- 在配置文件中声明广播的名称等属性
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
3.发送广播,通过获得Intent实例,调用sendBroadcast()方法发送广播。
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
2.2发送有序广播
- 发送有序广播只需将3.中的sendBroadcast()改为sendOrderedBroadcast()即可。
- 在配置文件中可以通过android:priority属性设置广播接收的优先级
<receiver
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">
<intent-filter android:priority="100">
<action android:name="com.example.broadcasttest.MY_BROADCAST"/>
</intent-filter>
</receiver>
3.在某个广播器中可以通过调用absortBroadcast()截断通知继续传播。
使用本地广播
- 使用本地广播的注意点
- 本地广播机制发出的广播只能够在应用程序的内部进行传递,简单的解决了广播的安全性问题。并且广播接收器也只能接收来自本应用程序发出的广播。
- 本地广播主要就是使用LocalBroadcastManager来对广播进行管理,并提供了发送和注册广播接收器的方法。
- 本地广播无法通过静态注册的方式来接收。因为静态注册主要是为了让程序在为启动的情况下也能收到广播,而发送本地广播的前提是程序处于启动状态。
- 使用本地广播的优势
1.可以明确的知道发送的广播不会离开程序,因此不必担心机密数据泄漏的问题。
- 其他程序无法将广播发送到我们的程序内部,因此不必担心安全漏洞隐患。
- 发送本地广播比发送系统全局广播更加高效。
-
使用实例如下
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private LocalReceiver localReceiver; private LocalBroadcastManager localBroadcastManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); localBroadcastManager = LocalBroadcastManager.getInstance(this); Button button = (Button) findViewById(R.id.button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); localBroadcastManager.sendBroadcast(intent); } }); intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); localReceiver = new LocalReceiver(); //注册广播 localBroadcastManager.registerReceiver(localReceiver, intentFilter); } //定义一个广播接收器 class LocalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "发送本地广播", Toast.LENGTH_SHORT).show(); } }
}