一、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. div盒子模型(一图胜千言)

    offsetLeft 获取的是相对于父对象的左边距 left 获取或设置相对于 具有定位属性(position定义为relative)的父对象 的左边距 如果父div的position定义为relat ...

  2. angularjs的service

    1.首先我们创建一个模块 var module = angular.module( "my.new.module", [] ); 2.然后写具体的service 可以看到它是一个很 ...

  3. Topcoder SRM548 Div 1

    1. KingdomAndTrees 给出n个数a[1..n],求一个数组b[1..n]满足b严格递增,且b[1]>=1. 定义代价为W = max{abs(a[i]-b[i])},求代价最小值 ...

  4. 关于Bootstrap 利用radio实现tab切换的一个问题

    1.html代码 <div class="col-sm-10 nav nav-tabs" id="typelist" role="tablist ...

  5. Cow Navigation(USACO)

    题目大意: 给定一个N*N的矩阵,并告诉你每一个格子能否经过,要求你求出(n,1)到(1,n)的最短路径的操作数. 其中操作有2种,第一种是沿着目前的方向走一格,第二种是向左或向右转90° 由于题目设 ...

  6. scrapy递归下载网站

    # encoding: utf-8 import os import re import subprocess import sys import chardet import scrapy fro ...

  7. 解析Linux内核的基本的模块管理与时间管理操作---超时处理【转】

    转自:http://www.jb51.net/article/79960.htm 这篇文章主要介绍了Linux内核的基本的模块管理与时间管理操作,包括模块加载卸载函数的使用和定时器的用法等知识,需要的 ...

  8. Linux内核驱动之延时---内核超时处理【转】

    转自:http://blog.chinaunix.net/uid-24219701-id-3288103.html 内核超时处理 jiffies 计数器 定时器中断由系统定时硬件以规律地间隔产生; 这 ...

  9. Appium+python自动化11-adb必知必会的几个指令【转载】

    前言 学android测试,adb是必学的,有几个常用的指令需要熟练掌握 一.检查设备 1.如何检查手机(或模拟器)是连上电脑的,在cmd输入: >adb devices

  10. mysql故障(找不mysql命令)

    [root@slave support-files]# mysql -uroot -p123-bash: mysql: command not found #我的mysql编译安装指定的路径是--ba ...