博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android基础 四大组件之广播(Broadcast)
阅读量:6289 次
发布时间:2019-06-22

本文共 4092 字,大约阅读时间需要 13 分钟。

四大组件之广播(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();    }}复制代码

然后再配置文件中注册:

复制代码

发送广播

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

发送标准广播

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

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

发送有序广播

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

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

//动态注册 intentFilter.setPriority(100); //静态注册 
复制代码

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

本地广播

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

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

注意事项

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

你可以通过以下方式关注我:

转载地址:http://vqkta.baihongyu.com/

你可能感兴趣的文章
[SilverLight]DataGrid实现批量输入(like Excel)(补充)
查看>>
秋式广告杀手:广告拦截原理与杀手组织
查看>>
翻译 | 摆脱浏览器限制的JavaScript
查看>>
闲扯下午引爆乌云社区“盗窃”乌云币事件
查看>>
02@在类的头文件中尽量少引入其他头文件
查看>>
JAVA IO BIO NIO AIO
查看>>
input checkbox 复选框大小修改
查看>>
BOOT.INI文件参数
查看>>
vmstat详解
查看>>
新年第一镖
查看>>
unbtu使用笔记
查看>>
OEA 中 WPF 树型表格虚拟化设计方案
查看>>
Android程序开发初级教程(一) 开始 Hello Android
查看>>
使用Gradle打RPM包
查看>>
“我意识到”的意义
查看>>
淘宝天猫上新辅助工具-新品填表
查看>>
再学 GDI+[43]: 文本输出 - 获取已安装的字体列表
查看>>
nginx反向代理
查看>>
操作系统真实的虚拟内存是什么样的(一)
查看>>
hadoop、hbase、zookeeper集群搭建
查看>>