一、Broadcast(广播)

  是一种广泛应用在应用程序之间传输信息的机制。

二、Broadcast(广播接收器)

  是对发送出来的广播进行过滤接收并响应的一类组件,它就是用来接收来自系统和应用中的广播。

  在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。

  Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。

  注意:

  1、BroadcastReceiver生命周期很短,如果超时了,系统会当当前广播为一个失败的请求。

  2、BroadcastReceiver不能做一些比较耗时的操作。

  3、应该通过发送Intent给Service,由Service来完成。

  4、不能使用子线程。

三、广播的分类

  1、普通广播(Normal Broadcasts):

  所有监听该广播的广播接收者都可以接受到该广播。

  特点:

  1)同级别接收先后是随机的(无序)。

  2)级别低的后接受到广播。

  3)接收器不能截断广播的继续广播也不能处理广播。

  4)同级别动态注册高于静态注册。

  2、有序广播(Ordered Broadcasts):

  按照接受者的优先顺序接收广播,有限级别在intent-filter中的priority中声明,-1000-2000之间,值越大,优先级越高。可以终止广播意图的继续传播。接受者可以纂改内容。

  特点:

  1)同级别接收顺序是随机的。

  2)能截断广播的继续传播,高级别的广播接收器收到广播后,可以决定是否把广播截断。

  3)接收器能截断广播的继续传播,也能处理广播。

  4)同级别动态注册高于静态注册。

  3、异步广播(粘滞性滞留广播):

  不能将处理结果传给下一个接受者,无法终止广播,会滞留在内存中,需要手动释放资源。

四、实例代码:

  三种广播的特点。

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
> <Button
android:id="@+id/btn1_send"
android:onClick="doSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送一条普通广播" /> <Button
android:id="@+id/btn2_send"
android:onClick="doSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送一条有序广播" /> <Button
android:id="@+id/btn3_send"
android:onClick="doSend"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="发送一条异步广播" />
</LinearLayout>

页面后台代码:main.java

package com.example.broadcastreceiverdemo;

import android.os.Bundle;
import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.view.Menu;
import android.view.View; public class MainActivity extends Activity { BC_3 bc3;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main); //动态注册,动态注册的优先级高于静态注册
/*IntentFilter filter = new IntentFilter("BC_One");
BC_2 bc2 = new BC_2();
registerReceiver(bc2, filter);*/
} public void doSend(View view){
//创建一个intent对象
Intent intent = new Intent();
switch(view.getId()){
case R.id.btn1_send:
//设置intent的值
intent.putExtra("msg", "这是btn1发送的一条普通广播");
//设置Action标记,用于过滤使用
intent.setAction("BC_One");
//发送普通广播
sendBroadcast(intent);
break;
case R.id.btn2_send:
//设置intent的值
intent.putExtra("msg", "这是btn2发送的一条有序广播");
//设置Action标记,用于过滤使用
intent.setAction("BC_One");
//发送有序广播
sendOrderedBroadcast(intent, null);
break; case R.id.btn3_send:
//设置intent的值
intent.putExtra("msg", "这是btn3发送的一条异步广播");
//设置Action标记,用于过滤使用
intent.setAction("BC_Three");
//发送异步广播
sendStickyBroadcast(intent); //先发送广播,后添加广播接收器
IntentFilter filter = new IntentFilter("BC_Three");
bc3 = new BC_3();
registerReceiver(bc3, filter);
break;
}
} @Override
protected void onDestroy() {
super.onDestroy();
//销毁驻留内存中的接收器
unregisterReceiver(bc3);
} }

自定义广播接收类bc_1.java

package com.example.broadcastreceiverdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle; //定义一个广播接收器,必须实现onReceive方法
public class BC_1 extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
System.out.println("bc1接收到的广播:" + intent.getStringExtra("msg")); //获取BC_2中处理的广播内容
Bundle bundle = getResultExtras(true);
System.out.println("获取追加后的数据:" + bundle.getString("appendStr"));
} }

第二个广播接受类:bc_2.java

package com.example.broadcastreceiverdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle; //定义一个广播接收器,必须实现onReceive方法
public class BC_2 extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
System.out.println("bc2接收到的广播:" + intent.getStringExtra("msg")); //截断广播,只有有序广播才可以被截断,普通广播无法被截断。
//abortBroadcast(); //处理广播,在广播中追加数据,只有有序广播可以处理,普通广播无法处理
Bundle bundle = new Bundle();
bundle.putString("appendStr", "追加的广播数据");
setResultExtras(bundle); //将追加的数据追加的广播中
} }

第三个广播接收类:接收异步广播,bc_3.java

package com.example.broadcastreceiverdemo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle; //定义一个广播接收器,必须实现onReceive方法
public class BC_3 extends BroadcastReceiver{ @Override
public void onReceive(Context context, Intent intent) {
System.out.println("bc3接收到的广播:" + intent.getStringExtra("msg"));
}
}

配置文件:如果是静态注册,需要在配置文件中注册广播接收器和过滤条件。如果是异步注册,需要打开异步滞留权限。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.broadcastreceiverdemo"
android:versionCode="1"
android:versionName="1.0" > <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="18" />
<!-- 异步广播驻留权限 -->
<uses-permission android:name="android.permission.BROADCAST_STICKY"/> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name="com.example.broadcastreceiverdemo.MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<!-- 静态注册 -->
<!-- 指定过滤器对应的类 -->
<receiver android:name="com.example.broadcastreceiverdemo.BC_1">
<!-- priority:设置广播的优先级,数字越大,级别越高 -->
<intent-filter android:priority="100">
<!-- 设置接收广播的过滤器,必须和发送时广播的action一致 -->
<action android:name="BC_One"></action>
</intent-filter>
</receiver>
<receiver android:name="com.example.broadcastreceiverdemo.BC_2">
<intent-filter android:priority="200">
<action android:name="BC_One"></action>
</intent-filter>
</receiver>
</application> </manifest>

Android学习(十三) BroadcastReceiver组件(广播)的更多相关文章

  1. Android学习笔记BroadcastReceiver(广播接收者)

    Android发送广播的过程 代码实现 MainActivity.java import androidx.appcompat.app.AppCompatActivity; import androi ...

  2. Android 学习笔记 BroadcastReceiver广播...

    PS:不断提升自己,是件好事... 学习内容: 1.BroadcastReceiver的使用.. 2.通过BroadcastReceiver去启动Service... 1.BroadcastRecei ...

  3. Android学习笔记⑧——UI组件的学习AdapterView相关2

    前面都是用ListView控件来配合Adapter做的一些实例,这次我们来见识一下GridView与Adapter之间的爱恨情仇.... GridView是用于在界面上按行.列分布的方式来显示多个的组 ...

  4. Android学习笔记⑦——UI组件的学习AdapterView相关1

    AdapterView是一个非常重要的组件之一,他非常灵活,所以得好好学...AdapterView本身是一个抽象类,派生出来的子类用法也十分相似,只是界面有一定的区别,因此本节把他们归为一类 Ada ...

  5. Android学习笔记⑥——UI组件的学习ImageView相关

    ImageView是集成了View的组件,它的主要工作就是显示一些图片啊,虽然他的用法一句话概括了,但是我觉得学起来应该不会太简单,正所谓 短小而精悍么 :) ImageView 派生了 ImageB ...

  6. Android学习笔记⑤——UI组件的学习TextView相关

    TextView是一个强大的视图组件,直接继承了View,同时也派生出了很多子类,TextView其作用说白了就是在布局中显示文本,有点像Swing编程中的JLabel标签,但是他比JLabel强大的 ...

  7. android学习十三(android的通知使用)

    通知(Notification)是android系统中比較有特色的一个功能,当某个应用程序希望向用户发出一些提示信息.而该应用程序又不在前台执行时,就能够借助通知来实现.发出一条通知后,手机最上方的状 ...

  8. android学习--TabHost选项卡组件

    TabHost是一种非常有用的组件,TabHost能够非常方便地在窗体上放置多个标签页,每一个标签页获得了一个与外部容器同样大小的组件摆放区域.在手机系统的应用类似"未接电话".& ...

  9. Android学习:自定义组件,DrawView

    布局文件: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:to ...

  10. android学习之EdieText组件的使用

    界面如下 移通152余继彪 该界面由四个EditText组件和Button按钮还有一个通知Toast完成,首先在xml文件中添加了四个组件和一个按钮还有一个文字显示框,java代码部分为button添 ...

随机推荐

  1. 简单粗暴!解决锐捷强制关闭VMware NAT Service的问题(图文教程)

    众所周知毒瘤的锐捷会定时强制关闭NAT服务,导致虚拟机连不上网,进而你的虚拟机就成了孤儿,只能玩单机. 在一番百度后,得到了一种神仙破解办法.原理是把锐捷关闭服务时所用的搜索关键字改掉,这样锐捷就搜不 ...

  2. 【Cocos2D研究院之游戏开发】

    http://www.xuanyusong.com/archives/category/ios/cocos2d_game 分类目录归档:[Cocos2D研究院之游戏开发]   201211-19 Co ...

  3. CyanogenMod编译

    1. 介绍 本文介绍了i9100手机CyanogenMod 13系统的编译方法 2. 系统要求 笔者使用的环境为CentOS-7-x86_64, 用来为i9100编译CM 13,之所以选择最新版的CM ...

  4. log4j配置文件动态指定日志文件名称

    我们在项目当中经常会使用log4j进行日志记录,偶尔会遇到一些要求,比如日志文件名称按照启动参数动态配置,而不去修改log4j.xml,比较简单的一种做法是,通过设置系统属性的方式实现,代码: if( ...

  5. java获取当前类名和方法名

    Description Below I present you two different ways to get the current Class: Using Thread Using getC ...

  6. MySQL -MMM 学习整理

    一. 规划 1.主机规划 服务器 IP 作用 monitor 10.0.0.10 监控服务器 master-01 10.0.0.5 读写主机01 master-02 10.0.0.6 读写主机02 s ...

  7. hdu 5138(水题)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=5138 反着来. #include<iostream> #include<cstdi ...

  8. 【原创】SSIS-执行包任务调用子包且子包读取父包变量

    背景: 有时候需要将一个个开发好的独立的ETL包串接起来形成一个独立而庞大的包,如:每家分公司都开发不同的ETL包,最后使用执行包任务来将这些分公司的包给串联起来形成一个独立而完整运行的ETL包,此时 ...

  9. MVC中AuthorizeAttribute用法并实现授权管理

    1.创建一个类(用来检查用户是否登录和用户权限)代码如下 public class MemberCheckAttribute : AuthorizeAttribute { //AuthorizeAtt ...

  10. 2018年最重要的HTML5开发手册,传播正能量

    今天给大家推荐这个HTML5开发手册,希望能帮助正在学习web前端的人,鄙人也是刚学习前端没多久,借助于一点资讯平台能够结识更多前端大牛,这是我的web前端/HTML5/javscript技术学习群: ...