Android基础---四大组件之广播(Broadcast)

四大组件之广播(Broadcast)

最近学习了安卓四大组件之广播的用法。下面简单的总结下:

广播其实是一种信息的传递,主要分为标准广播和有序广播。下面举例描述下,

广播分类

标准广播

在我们的日常工作中,如果单位要告诉全体员工周末全体加班,只需要给全体员工发一个邮件出去,这样员工就能收到周末加班的邮件,就可以在周末来加班了,这种方式是全体员工都能收到,不能被截断,这就是标准广播;
特点:
1. 同级别接收先后是随机的(无序的)
2. 级别低的后接收到广播
3. 接收器不能截断广播的继续传播,也不能处理广播
4. 同级别动态注册(代码中注册)高于静态注册(AndroidManifest中注册)

有序广播

有些时候,单位的老大并不想直接给全体员工都发邮件,那么邮件走向可能就是这样的情况,老大---总经理---副总经理---项目经理等等,这样加班的信息是根据职位的高低(广播的优先级)一级一级的传递的,到每一级都可以被继续传递或者停止传递,所以这种信息是有可能被截断的这就是有序广播。
特点:

  1. 同级别接收是随机的
  2. 能截断广播的继续传播,高级别的接收到广播之后,可以截断传播,是通过intent-filter中的priority声明的,范围是-1000到1000
  3. 能接收广播。也可以处理广播
  4. 同级别动态注册(代码中注册)高于静态注册(AndroidManifest中注册)

广播接收器的注册

注册广播一般有两种方式

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

顾名思义,就是在代码中注册的,比如在一个button的点击事件中点击时:

package com.css.sean.broadcasttest;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;

public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;//用于处理过滤特定的intent
    private NetworkChangeReceiver networkChangeReceiver;//广播接收器

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        //指定过滤器的action,这里传入的是网络状态发生改变时发出的广播
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        networkChangeReceiver = new NetworkChangeReceiver();
        registerReceiver(networkChangeReceiver, intentFilter);//注册广播
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(networkChangeReceiver);//用完之后取消注册
    }

    //用于监听网络状态的广播接收器
    private class NetworkChangeReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //ConnectivityManager是系统服务类,专门用来管理网络连接的
            ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
            NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
            if (networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeText(MainActivity.this, "网络状态可用!", Toast.LENGTH_SHORT).show();
            } else {
                Toast.makeText(MainActivity.this, "网络状态不可用!", Toast.LENGTH_SHORT).show();
            }

        }
    }
}

2. 在配置文件AndroidManifest中注册(静态注册)

动态注册时必须程序在运行时才能注册的,有一定的局限性,如果我们需要在程序还没启动的时候就可以接收到注册的广播,就需要静态注册了,下面用接收开机启动开举例:
首先创建一个广播类:

public class BootCompleteReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"开机启动广播",Toast.LENGTH_SHORT).show();
    }
}

然后再配置文件中注册:

 <receiver android:name=".BootCompleteReceiver">
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>
        </receiver>

发送广播

广播接收器不仅可以接收系统发出的广播,也可以接收自定义的广播。

发送标准广播

//创建一个intent,带有参数就是Filter的action
Intent intent = new Intent("com.sean.css.MY_BROADCAST");
//发送广播
sendBroadcast(intent);

是不是很简单,只需要两行代码,但是别忘了,这只是发出的广播,还要去写一个广播接收器去接受这个广播,然后去执行的操作,并且大家intent是可以传递数据的,当然也可以在intent中加入参数进行传递,这样就可以在广播接收器中拿到这个参数了

发送有序广播

//创建一个intent,带有参数就是Filter的action
Intent intent = new Intent("com.sean.css.MY_BROADCAST");
//发送广播
sendOrderBroadcast(intent,null);

看起来和发送普通广播也差不多,主要就是在发送的时候方法变了,并且参数也变成了两个,第二个参数是与权限有关的字符串,前面说过,有序广播是有顺序的,所以是涉及到多个广播接收器的,只需要在我们注册广播接收器的时候加入以下代码:

//动态注册
 intentFilter.setPriority(100);
 //静态注册
 <intent-filter  android:priority="200">
                <action android:name="android.intent.action.BOOT_COMPLETED"></action>
            </intent-filter>

这样priority为200的会先收到广播,然后priority为100的后收到广播,如果先收到的广播在执行完自己操作后执行abortBroadcast();那么优先级为100的就收不到该广播了。

本地广播

前面我们发出的广播,不仅仅是我们自己的程序可以收到,其他的应用程序也可以收到,这样的话有可能会引起一定的安全问题,比如其他的应用程序可以一直向我们的程序发送垃圾广播,干扰我们程序的正常运行。幸好Android中有一个本地广播的机制,如果使用本地广播管理,那么只能在本地接收、发送广播。使用起来非常方便,只需要在发送或者接收的时候调用LocalBroadcastManager就行了,比如:

//发送
localBroadcastManager.sendBroadcast(inetnt);
//接收
localBroadcastManager.registerReceiver(localReceiver,intentFilter);

注意事项

BroadcastReceiver的生命周期只有10秒左右,不能再里面做一些耗时的操作,如果要做耗时的操作,应该通过发送Intent给Service,由Service来完成耗时操作,并且不能在BroadcastReceiver中使用子线程

我在博客园的小例子:广播实现强制下线

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

推荐阅读更多精彩内容