从0系统学Android--5.2 发送广播

从0系统学Android--52 发送广播

image

image

本系列文章目录更多精品文章分类

本系列持续更新中.... 初级阶段内容参考《第一行代码》

5.3 发送自定义广播

前面已经学习了如何接受广播了,下面来学习如何发送自定义广播,广播类型分为:标准广播和有序广播,下面分别来说一下这两种广播如何发送。

5.3.1 发送标准广播

首先我们先创建一个广播接收器,用来接收我们发送的自定义广播。

用静态广播来实现

public class MyReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"接收到了",Toast.LENGTH_SHORT).show();
    }
}

   <receiver
            android:name="com.example.firstcode.fifty_chapter.norboardcast.MyReceiver"
            android:enabled="true"
            android:exported="true"
            android:permission="no">
            <intent-filter>
                <action android:name="com.my_broadcast"/>
            </intent-filter>
        </receiver>
                  
这里 action 里面写自己要发送的广播的名字就可以了

随便在一个页面添加发送代码:

      buttonSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.my_broadcast");
                sendBroadcast(intent);

            }
        });

需要注意一点,上面的这种做法在 Android 8.0前是好用的,在 8.0 后进行了限制,限制通过静态注册来接受隐式广播详见 其实对于部分隐式广播也是可以的比如开机广播

通过这个限制我们可以得到解决办法有两种:

1.不通过静态注册接收器,通过动态注册就可以了

2.通过静态注册接收器,但是发送的广播不要是隐式的。

第一种很简单,就是动态注册,这里不演示了,演示第二种:

 buttonSend.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent("com.my_broadcast");
                // 明确指明要此广播要发送给的组件
                intent.setComponent(new ComponentName(NetChangeActivity.this, MyReceiver.class));
                NetChangeActivity.this.sendBroadcast(intent);
           

            }
        });

由于广播是通过 Intent 来进行传递的因此我们可以通过 Intent 来携带一些数据。

5.3.2 发送有序广播

广播是一种跨进程的通信,也就是说可以让不同的应用程序进行通信

如何发送有序广播呢?

 NetChangeActivity.this.sendOrderedBroadcast(intent,null);

这样就是发送有序广播了,第二个参数是与权限有关,传入 null 就可以了

那么如何设置接收器接受的顺序呢?

  <intent-filter android:priority="100">
                <action android:name="com.my_broadcast.MY_BROADCAST"/>
            </intent-filter>

通过 android:priority 来设置。同样接收器在接收到消息后也可以通过 abortBroadcast() 来截取广播,让后面的接收器无法再接受到这条广播。

5.4 使用本地广播

前面我们发送和接受的广播全部属于系统全局广播,也就是说这些广播可以被系统中的其他应用程序接收到,并且我们也可以接受到来自其他任何应用的广播。这样容易引起安全问题。

为了解决这个问题,Android 引入了一套本地广播机制,使用这个机制广播只能够在程序内部进行传递。其实实现很简单就是通过 LocalBroadcastManager 来对广播进行管理。

下面我们就来列几个方法就可以了

LocalBroadCastManager localBroadCastManager = LocalBroadCastManager.getInstance(this)// 获取实例
// 发送广播的时候
Intent intent = new Intent("com.broadcst.syd");
localBroadCastManager.senBroadCast(intent);

// 注册广播接收器
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.broadcst.syd");
localBroadCastManager.registerReceiver(localReceiver,intentFilter);

// 取消注册
localBroadCastManager.unregisterReceiver(localReceiver);

其实和之前动态注册发送都是一样的,只是换了一个类来执行而已。

本地广播是无法通过静态注册的 ,这很好理解,静态注册是为了让应用程序还没有启动就能接受广播,而发送本地广播的时候,程序肯定已经启动了,因此完全不需要静态注册了。

注意这里的本地指的是当前应用程序内

使用本地广播优势:

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

推荐阅读更多精彩内容