Android广播机制和广播接收器Broadcast Receiver

[TOC]

简介

广播机制,本质上是一种组件间的通信方式,如果是两个组件位于不同的进程当中,也可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而,广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。

广播负责发出信号,需要用四大组件之一的Broadcast Receiver广播接收器接收信号。一般四大组件都要注册在清单文件中,而广播也可以在代码中注册;

广播分类

Android中的广播主要可以分为两种类型,标准广播和有序广播。

  1. **标准广播****(Normal broadcasts):标准广播是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎会在同一时刻接收到这条广播消息。这种广播效率比较高,但同时也意味着它是无法被截断的。
  2. 有序广播(Ordered broadcasts):有序广播则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕之后,广播才会继续传递。
  3. 系统广播 Android 内置了很多系统级别的广播,我们可以在应用中通过监听这些广播来得到各种系统的状态信息
  4. 本地广播 为了解决广播安全性问题,Android 引入了一套本地广播机制,使用这个机制发出的广播只能在应用程序内部进行传递,并且广播接受器也只能接受来自本应用程序发出的广播;

使用

注册广播接收器

静态广播和动态广播的区别

  1. 生存期,静态广播的生存期可以比动态广播的长很多,因为静态广播很多都是用来对系统时间进行监听,比如我们可以监听手机开机。而动态广播会随着context的终止而终止

  2. 优先级,动态广播的优先级比静态广播高

  3. 静态广播比较耗费资源

  4. 静态注册可以让程序在停止状态的情况下就能接收到广播。

    停止状态

    1. 应用安装后未运行

    2. 应用被手动(设置-应用-强制停止)或者被其他应用强制停止

      如果需要启动处于停止状态的应用,则只要为Intent添加FLAG_INCLUDE_STOPPED_PACKAGES 标记即可。(stopped机制)

1.静态注册(和在 AndroidManifest.xml 中注册)

  <receiver
        android:name=".MyReceiver"
        android:enabled="true"
        android:exported="true">
        <intent-filter>
            <action android:name="MyAction" />
        </intent-filter>
  </receiver>

2.动态注册(在代码中注册)

动态注册广播接收器可以自由地控制注册与注销。但必须先注册,再发送广播才能接收到广播。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    //实例化广播接收器对象
    reciever = new MyReceiver();
    //构建一个意图过滤器IntentFilter
    IntentFilter filter = new IntentFilter();
    //添加Action表明该广播接收器能接收什么类型的广播
    filter.addAction("MyAction");
    //注册广播接收器
    registerReceiver(reciever,filter);
    //动态注册时,先注册,再发送广播
    sendBroadcast(new Intent("MyAction"));
 }
 @Override
 protected void onDestroy() {
    super.onDestroy();
    //解除注册
    if(reciever != null)unregisterReceiver(reciever);
}

广播接收器

public class MyReceiver extends BroadcastReceiver {
    public MyReceiver() {
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        // TODO: 这个方法在广播接收器接收时被调用
        // an Intent broadcast.
        //throw new UnsupportedOperationException("Not yet implemented");
        System.out.print("程序已启动");
        Toast.makeText(context,"程序已启动",Toast.LENGTH_SHORT).show();
    }
}

发送广播

sendBroadcast(Intent var1);
    public abstract void sendBroadcast(Intent var1, String var2);

    public abstract void sendOrderedBroadcast(Intent var1, String var2);

    public abstract void sendOrderedBroadcast(Intent var1, String var2, BroadcastReceiver var3, Handler var4, int var5, String var6, Bundle var7);
//var2:接收权限 var3:指定必须收到的接收器 var4:消息处理器 var6:传入的字符串 var7:传入的bundle;

    public abstract void sendBroadcastAsUser(Intent var1, UserHandle var2);

    public abstract void sendBroadcastAsUser(Intent var1, UserHandle var2, String var3);

    public abstract void sendOrderedBroadcastAsUser(Intent var1, UserHandle var2, String var3, BroadcastReceiver var4, Handler var5, int var6, String var7, Bundle var8);

接受权限配置

    <permission android:name="你自定义的权限名称" android:protectionLevel="normal"></permission>   

终止广播

在广播接收器里调用abortBroadcast()阻止其他接受者接收,只适用于有序广播。

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