Android08-广播机制

广播的类型:

  1. 标准广播:完全异步执行的广播,这也意味着,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到广播消息,因此它们之间没有先后顺序可言,这种广播的效率会比较高,标准广播的流程图如下所示。图片来自第一行代码


    Android08-广播机制_第1张图片
    2017-04-07_14-07-37.png
  1. 有序广播:一种同步执行的广播,在广播发出之后,同一时刻只有一个广播接收器能够收到这条广播消息。当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。


    Android08-广播机制_第2张图片
    2017-04-07_14-09-52.png

1. 接收系统广播

Android内置了很多系统级别的广播,比如电池电量,时区时区、开关机、等状态变化时都可以发送系统广播。

  • 广播接收器的简介

广播接收器可以自定义对某些广播进行注册,当收到注册的广播时能够在内部做相应的逻辑处理。

  • 如何创建一个广播接收器:

新建一个类,让它继承自Broadcast-Receiver,并重写父类的onReceive()方法。这样当有广播进来的时,就会调用onRecevier()方法。

  • 注册广播的方式:
  1. 在代码中注册:也称为动态注册,动态注册的广播接收器在处理完业务之后都要取消注册。
  2. 在AndroidManifest.xml中注册:也称为静态注册。
    注:动态注册虽然灵活性高,但是需要在打开程序的情况下才可接收到广播。所以当需要实现开启启动时就需要用到静态注册了。另外在注册前都需要在配置文件中声明权限,否则直接崩溃
```

package="com.example.anwser_mac.broadcasttest">

```

  • 使用广播的注意点

1.如果是静态注册广播的话需要在配置文件说明,如果是通过系统创建的话则系统会自动添加

android:name=".BootCompleteReceiver"
android:enabled="true"
android:exported="true">

2.动态广播接收器在处理完业务之后要记得取消注册。
3.涉及系统权限的广播都要在配置文件做声明。
4.广播接收器中不允许开启线程,因此不能够在onReceiver()方法中处理过多逻辑或耗时操作,一般广播接收器扮演的是打开程序其他组件的角色,比如创建状态栏通知,或者启动一个服务。

2. 发送自定义的广播

2.1 发送标准广播

具体思路

  1. 新建一个类,继承自BroadcastReceiver,重写onReceive()方法
  2. 在配置文件中声明广播的名称等属性
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">

    

3.发送广播,通过获得Intent实例,调用sendBroadcast()方法发送广播。

Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);

2.2发送有序广播

  1. 发送有序广播只需将3.中的sendBroadcast()改为sendOrderedBroadcast()即可。
  2. 在配置文件中可以通过android:priority属性设置广播接收的优先级
android:name=".MyBroadcastReceiver"
android:enabled="true"
android:exported="true">

        

3.在某个广播器中可以通过调用absortBroadcast()截断通知继续传播。

使用本地广播

  • 使用本地广播的注意点
  1. 本地广播机制发出的广播只能够在应用程序的内部进行传递,简单的解决了广播的安全性问题。并且广播接收器也只能接收来自本应用程序发出的广播。
  2. 本地广播主要就是使用LocalBroadcastManager来对广播进行管理,并提供了发送和注册广播接收器的方法。
  3. 本地广播无法通过静态注册的方式来接收。因为静态注册主要是为了让程序在为启动的情况下也能收到广播,而发送本地广播的前提是程序处于启动状态。
  • 使用本地广播的优势

1.可以明确的知道发送的广播不会离开程序,因此不必担心机密数据泄漏的问题。

  1. 其他程序无法将广播发送到我们的程序内部,因此不必担心安全漏洞隐患。
  2. 发送本地广播比发送系统全局广播更加高效。
  • 使用实例如下

    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();
          }
      }
    

}

你可能感兴趣的:(Android08-广播机制)