Android08-广播机制

广播的类型:

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


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


    2017-04-07_14-09-52.png

1. 接收系统广播

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

  • 广播接收器的简介

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

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

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

  • 注册广播的方式:
  1. 在代码中注册:也称为动态注册,动态注册的广播接收器在处理完业务之后都要取消注册。
  2. 在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 发送标准广播

具体思路

  1. 新建一个类,继承自BroadcastReceiver,重写onReceive()方法
  2. 在配置文件中声明广播的名称等属性
<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发送有序广播

  1. 发送有序广播只需将3.中的sendBroadcast()改为sendOrderedBroadcast()即可。
  2. 在配置文件中可以通过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()截断通知继续传播。

使用本地广播

  • 使用本地广播的注意点
  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();
          }
      }
    

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,290评论 6 491
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,107评论 2 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,872评论 0 347
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,415评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,453评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,784评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,927评论 3 406
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,691评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,137评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,472评论 2 326
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,622评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,289评论 4 329
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,887评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,741评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,977评论 1 265
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,316评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,490评论 2 348

推荐阅读更多精彩内容