一、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. PHP会话控制

         会话控制的思想是指能够在网站中根据一个会话跟踪用户.      PHP的会话是通过唯一的会话ID来驱动的.会话ID是一个加密的随机数字.它由PHP生成,在会话的生命周期中都会保存在客户端.它 ...

  2. Python数据结构——栈

    栈是一种特殊的列表,栈内的元素只能通过列表的一端访问,这一端称为栈顶.栈被称为一种后入先出(LIFO,last-in-first-out)的数据结构. 由于栈具有后入先出的特点,所以任何不在栈顶的元素 ...

  3. cocos2d-iphone 与 UI组件

    http://zhidao.baidu.com/link?url=v9d7y2doWqcPhKz1lz8TkO7ZQfslg-e-55JE0XP9VdKJ0vHobcLPEAXaXjD2lD-TGmg ...

  4. Linux下配置APUE的编译环境

    APUE即Unix环境高级编程,本书中几乎所有的程序都包含一个apue.h的头文件,那如何配置这个apue.h呢? 1.我们可以在http://pan.baidu.com/s/1dDxmtbF中下载, ...

  5. 2018 ICPC 徐州邀请赛 总结

    Day 0 上午在高铁里面,很困但是睡不着…… 中午到矿大报道. 食堂饭菜不错,有西瓜,就是有点辣. 下午热身赛,D题队友想了个假算法……GG. 评测机摸底考试正常进行. 热身赛之后精疲力尽,赶到宾馆 ...

  6. poj3693(后缀数组)

    poj3693 题意 给出一个串,求重复次数最多的连续重复子串,输出字典序最小的. 分析 论文 例8(P21). Sparse-Table算法预处理出任意两个后缀串的LCP. code #includ ...

  7. 浅析 Node.js 单线程模型

    总结笔记:对于每个用户请求,由主线程接收并存放于一个事件队列中(不做任何处理),当无请求发生时,即主线程空闲,主线程开始循环处理事件队列中的任务: 对于非阻塞JS程序: 1.若某事件需要I/O操作,则 ...

  8. Xamarin XAML语言教程通过ProgressTo方法对进度条设置

    Xamarin XAML语言教程通过ProgressTo方法对进度条设置 在ProgressBar中定义了一个ProgressTo方法,此方法也可以用来对进度条当前的进行进行设置,ProgressTo ...

  9. Hadoop 2.2.0 Job源代码阅读笔记

    本文所有涉及的内容均为2.2.0版本中呈现. 概述: Job在创建Job并且提交的人的眼中,可以在创建的时候通过配置Job的内容,控制Job的执行,以及查询Job的运行状态.一旦Job提交以后,将不能 ...

  10. Flex this

    为了便于对比和叙述,我们先上一段最简单的js+html代码:<input type="button" value="test" id="htmB ...