文档章节

Android四大组件-BroadcastReceiver

北ing
 北ing
发布于 2015/10/20 19:22
字数 1732
阅读 13
收藏 1
点赞 0
评论 0

一、简介

1.定义:广播接收器,即接收通过某一频道(Action)发送的广播,发送者可以是Activity和Service。

2、作用:
1) 监听系统的广播,并做相应的处理,如电量过低时需要保存相关数据,或发出通知警告用户
2)后台运行的服务,如经过耗时操作后,获取了网络数据,通过广播的方式通知用户。

3、常用的系统广播:注意:系统广播要严格按照官方API的说明方式使用
1)Intent.ACTION_BOOT_COMPLETED 系统开机启动完成
2)Intent.ACTION_SHUTDOWN 关机提醒广播
3)Intent.ACTION_BATTERY_LOW 低电量提醒广播
4)Intent.ACTION_BATTERY_CHANGED 电量发生变化广播(仅支持代码中注册)
5)Intent.ACTION_SCREEN_OFF 屏幕被关闭
6)Intent.ACTION_SCREEN_ON 屏幕已经被打开
7)Intent.ACTION_USER_PRESENT 屏幕解锁广播
8)Intent.ACTION_NEW_OUTGOING_CALL 拨号广播
9) TelephonyManager.ACTION_PHONE_STATE_CHANGED 来电时电话状态变化广播,如响玲、空置、挂断
10) Telephony.Sms.Intents.SMS_RECEIVED_ACTION 接收短信的广播

二、用法

1.步骤
1)创建类,继承BroadcastReceiver类
2) 重写onReceiver(Context,Intent)方法
3) 注册广播
-在AndroidManifest.xml中注册(全局)
-动态注册(局部):registerReceiver(BroadcastReceiver,IntentFilter)
4)发送广播
- Context.sendBroadcast(Intent)
- Context.sendBroadcast(Intent,String) 带有权限发送广播

三、广播的生命周期

1.继承后需要重写的唯一 一个方法onReceiver(Context,Intent)
2.在这个方法里可以做的事情
1)Toast
2)NotifyManager
3)Context.startActivity(Intent)
4)Context.sendBroadcast
5)Context.startService
6)IBinder BroadcastReciver.peekService(Context,Intent)
3.注意事项
1)广播接收者的生命周期是非常短暂的,在接收到广播的时候创建,onReceive()方法结束之后销毁
2)广播接收者中不要做一些耗时的工作,否则会弹出Application No Response错误对话框
3)最好也不要在广播接收者中创建子线程做耗时的工作,因为广播接收者被销毁后进程就成为了空进程,很容易被系统杀掉
4)耗时的较长的工作最好放在服务中完成

四、广播的分类

1、标准广播:
是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播信息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被拦截的。
这里写图片描述

2、有序广播:
是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能接受到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收是有先后顺序的,优先级高的广播接收器就可以先接收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法接收到广播消息了。

这里写图片描述

3、粘性广播
1)特点:普通的广播如果onReceive方法执行时间太长,超过10秒的时候系统会将这个广播置为可以干掉的candidate,一旦系统资源不够的时候,就会干掉这个广播而让它不执行
2)Intent会一直保留到广播事件结束,没有所谓的10秒限制
3)sendStickyBroadcast() 发送粘性的广播
4)android.Manifest.permission.BROADCAST_STICKY 声明权限

五、广播的安全性

1.发送广播时
1)发送带权限的广播sendBroadcast(Intent,permission)
2)指定接收广播的应用包名Intent.setPackage(“com.trainmobile.ss”)

2.在AndroidManifest.xml清单中配置

1)<permisson android:name="" /> 定义权限
2)<uses-permission android:name=".."> 使用权限

3.注册接收广播时

1Context.registBroadcast(Intent,String),String为接收广播的权限
2)<receiver androd:exported="false" ..>不接收外部应用的广播 

4.使用本地广播接收者LocalBroadcastManager
1)所在包:android.support.v4.content
2)LocalBroadcastManager.getInstance(Context)
3)registReceiver(BroadcastReceiver,IntentFilter)
4)sendBroadcast(Intent)
5)sendBroadcastSync(Intent intent)
6)unregisterReceiver(BroadcastReceiver receiver)

六、广播接收者的使用

1、案例1:接收电池电量改变时发送的广播
步骤:
接收系统广播(三大要素:广播的Action、接收广播的权限、广播中包含的数据)
1)自定义广播接收器类,继承BroadcastReceiver,并重写onReceiver()方法
2)注册广播接收器,同时通过IntentFilter声明广播接收器可以接收的广播频道(Action)
3)在广播接收的方法中,实现相关的操作(UI线程中执行的)

class MyReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent) {
            //TODO 接收广播的方法--UI线程中执行的方法
            //3.获取广播中的数据,并显示在UI控件上
            //获取电量的等级信息(百分比)
            String action = intent.getAction();
            Log.i("--", action);
            int level = 0;
            if(action == Intent.ACTION_BATTERY_CHANGED){
                level = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0);
                textview.setText("当前电量:" + level + "%");
                if(level < 10){
                    //...
                }
            } else if(action == Intent.ACTION_BATTERY_LOW){
                textview.setText("电量过低");
            }else if(action == Intent.ACTION_POWER_CONNECTED){
                textview.setText("电源连接");
            }else if(action == Intent.ACTION_POWER_DISCONNECTED){
                textview.setText("电源断开");
                Intent infoIntent = new Intent(context, InfoActivity.class);
                context.startActivity(infoIntent);
            }
        }
    }
myReceiver = new MyReceiver();
        IntentFilter filter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
        //增加可以接收的广播频道
        filter.addAction(Intent.ACTION_BATTERY_LOW);
        filter.addAction(Intent.ACTION_POWER_CONNECTED);//电源连接的广播
        filter.addAction(Intent.ACTION_POWER_DISCONNECTED);//电源断开连接的广播
        //2.注册广播接收器-接收系统点亮改变的广播
        registerReceiver(myReceiver, filter);

2、案例2:开机自自动:实现很简单
1)自定义一个广播接收者

public class RootReceiver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Intent mainIntent = new Intent(context, MainActivity.class);
        context.startActivity(mainIntent);
    }
}

2)在清单文件中注册广播接收者


<receiver android:name="com.example.broadcastreceiver_2.RootReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <action android:name="android.intent.action.ACTION_USER_PRESENT" />
                <action android:name="android.intent.action.ACTION_SCREEN_OFF" />
                <action android:name="android.intent.action.ACTION_SCREEN_ON" />
            </intent-filter>
        </receiver>

3)关机开机试试看,实际开发中,一般的应用开机自启动都会被拒绝

3、案例3:有序广播的发送
1)定义三个自定义广播接收器
2)在清单文件中注册

<receiver android:name="com.beiing.broadcastreceiver_4.MyReceiver_1" >
            <intent-filter>
                <action android:name="com.beiing.broadcast.print" />
            </intent-filter>
        </receiver>
        <receiver android:name="com.beiing.broadcastreceiver_4.MyReceiver_2" >
            <intent-filter>
                <action android:name="com.beiing.broadcast.print" />
            </intent-filter>
        </receiver>
        <!-- android:exported="false" 不接受外部应用发送的广播 -->
        <receiver android:name="com.beiing.broadcastreceiver_4.MyReceiver_3" >
            <!-- 设置优先级 -1000~1000 -->
            <intent-filter android:priority="100" >
                <action android:name="com.beiing.broadcast.print" />
            </intent-filter>
        </receiver>

3)发送广播,看三个广播接收器的打印日志
4)测试:当发送标准广播时,sendBroadcast(。。),三个广播接收者会按注册的先后打印日志,然后把广播接收者3设置优先级高于1和2发送一个有序广播,sendOrderedBroadcast(。。),这样3会最先接收,然后1、2接收,如果这时候在3中调用切断广播的方法abortBroadcast();
广播将不会再往后发送。

最后说一点:之前讲到的handler可以进行子线程和主线程通信,现在通过发送广播和接收广播的方式也可以进行子线程和主线程通信。

七、源码下载

源码1
源码2
源码3

版权声明:本文为博主原创文章,未经博主允许不得转载。

© 著作权归作者所有

共有 人打赏支持
北ing
粉丝 0
博文 12
码字总数 17332
作品 0
海淀
Android 性能优化:手把手教你优化Bitmap图片资源的使用

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的Bitmap 使用优化,希望你们会喜欢 目录 1. 优化原因 即 为什么要优化图片资源,具体如下图:

Carson_Ho ⋅ 04/24 ⋅ 0

andriod-四大组件之广播Broadcast-短信的收发

我想几乎所有的安卓开发者,第一个接触到的四大组件之一就是activity,而我在之前的文章中也写过, 在activity里面getContext是大佬级别的存在(可以看前几章), 那么四大组件中的广播Broad...

九尾74 ⋅ 05/24 ⋅ 0

BroadcastReceiver的源码分析

android提供了广播机制,通过BroadcastReceiver可以在不同的进程间传递消息。类似于观察者模式,A应用通过注册广播表示A对消息subject感兴趣,当B应用发出subject类型的消息的时候,A应用就能...

JasmineBen ⋅ 05/18 ⋅ 0

Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho ⋅ 06/06 ⋅ 0

Android:手把手教你学会使用Google出品的序列化神器Protocol Buffer

前言 习惯用 数据存储格式的你们,相信大多都没听过 其实 是 出品的一种轻量 & 高效的结构化数据存储格式,性能比 真的强!太!多! 由于 出品,我相信已经具备足够的吸引力 今天,我将详细介...

Carson_Ho ⋅ 04/16 ⋅ 0

通读《疯狂Android讲义》笔记 01 ___Android基础篇

文 | 莫若吻 注: 1.本文内容参考 李刚的《疯狂Android讲义》一书。 2.此书适合有一定Java基础、初学Android的同学阅读与学习。我最近想巩固下Android基础知识就来拜读一下此书。 3.本文笔记...

莫若吻 ⋅ 2017/11/06 ⋅ 0

Android 四大组件(四)BroadcastReceiver

转载请注明出处:http://blog.csdn.net/vnanyesheshou/article/details/75449100 Andorid四大组件Activity、Service、ContentProvider都已经总结了,详情可以参考如下: Android 四大组件(一...

VNanyesheshou ⋅ 2017/07/20 ⋅ 0

Android性能优化:这是一份详细的布局优化 指南(含、、)

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的布局优化,希望你们会喜欢。 目录 /** 实例说明:在上述例子,在布局B中 通过标签引用布局C 此时:布局层级为 = RelativeLa...

Carson_Ho ⋅ 05/14 ⋅ 0

Android性能优化:那些不可忽略的绘制优化

前言 在 开发中,性能优化策略十分重要 本文主要讲解性能优化中的绘制优化,希望你们会喜欢。 目录 // 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除 优化方案2:移除 控件...

Carson_Ho ⋅ 05/21 ⋅ 0

要点提炼|开发艺术之四大组件

提到四大组件大家肯定再熟悉不过了,本篇侧重于对四大组件工作过程的分析: 概述 工作过程 Activity Service BroadcastReceiver ContentProvider 1.概述 a.Activity 类型:展示型组件。 作用...

minmin_1123 ⋅ 2017/12/27 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

实验楼—MySQL基础课程-挑战3实验报告

按照文档要求创建数据库 sudo sercice mysql startwget http://labfile.oss.aliyuncs.com/courses/9/createdb2.sqlvim /home/shiyanlou/createdb2.sql#查看下数据库代码 代码创建了grade......

zhangjin7 ⋅ 昨天 ⋅ 0

VS2015配置并运行汇编(一步一步照图做)【vs2017的链接在最后】

x64: TITLE Add and Subtract (AddSub.asm) ; This program adds and subtracts 32-bit integers. ; Last update: 2/1/02 ;.MODEL flat,stdcall x64 not su......

simpower ⋅ 昨天 ⋅ 0

一起读书《深入浅出nodejs》-node模块机制

node 模块机制 前言 说到node,就不免得提到JavaScript。JavaScript自诞生以来,经历了工具类库、组件库、前端框架、前端应用的变迁。通过无数开发人员的努力,JavaScript不断被类聚和抽象,...

小草先森 ⋅ 昨天 ⋅ 0

Java桌球小游戏

其实算不上一个游戏,就是两张图片,不停的重画,改变ball图片的位置。一个左右直线碰撞的,一个有角度碰撞的。 左右直线碰撞 package com.bjsxt.test;import javax.swing.*;import j...

森林之下 ⋅ 昨天 ⋅ 0

你真的明白RPC 吗?一起来探究 RPC 的实质

你真的明白RPC 吗?一起来探究 RPC 的实质 不论你是科班出身还是半路转行,这么优秀的你一定上过小学语文,那么对扩句和缩句你一定不陌生。缩句就是去除各种修饰提炼出一句话的核心,而不失基...

AI9o後 ⋅ 昨天 ⋅ 0

z-index设置失效?

今天碰到了一个问题,就是在给li设置提示框的时候,有用到遮罩效果,本来想把对应的出现在最顶层,可是不管将li设置的z-index值设为多大,li都没有出现在遮罩层之上。 我在网上查了z-index设...

IrisHunag ⋅ 昨天 ⋅ 0

CyclicBarrier、CountDownLatch以及Semaphore使用及其原理分析

CyclicBarrier、CountDownLatch以及Semaphore是Java并发包中几个常用的并发组件,这几个组件特点是功能相识很容易混淆。首先我们分别介绍这几个组件的功能然后再通过实例分析和源码分析其中设...

申文波 ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部