Android BroadcastReceiver基础详解一

-、BroadcastReceivcer概述

1、什么是广播

BroadcastReceiver是Android四大组件之一,本质是一种全局的监听器,用于监听系统全局的广播消息。因此它可以非常方便的实现不同组件之间的通信。

2、BroadcastReceiver的创建启动

BroadcastReceiver是用用于接受程序所放出的Broadcast Intent,与应用程序启动的Activity、Service相同。也只需要两步:

①、创建需要启动的Broadcast的Intent

②、创建一个类继承BroadcastReceiver,在清单文件中注册Receiver,调用content的SendBroadcast()或sendOrderedBroadcast()(发送有序广播)的方法来启动指定的BroadcastReceiver

注:当应用程序发出一个Broadcast Intent之后,所有匹配该Intent的BroadcastReceiver都会启动。如果你不需要发送广播跨应用程序,考虑使用 这类 LocalBroadcastManager


1

2

3

4

5

6

7

8

9

10

11

12

13

protected void onCreate(Bundle
savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    bt_startbroadcast
= (Button) 
this.findViewById(R.id.bt_startbroadcast);

    bt_startbroadcast.setOnClickListener(new View.OnClickListener()
{

        public void onClick(View
v) {

            Intent
intent = 
new Intent(MainActivity.this,
myBroadcast.
class);

            intent.putExtra("broadcast""hello,world!
broadcast"
);

            sendBroadcast(intent);

        }

    });

}


1

2

3

public void onReceive(Context
context, Intent intent) {

        Toast.makeText(context,"receiver-----" +
intent.getStringExtra(
"broadcast"), 1).show();

    }

3、有序广播

  • 正常播放 (发送 Context.sendBroadcast )是完全异步的。 所有的BroadcastReceiver是运行在一个未定义的顺序,常常在同一时间。 这时效率更高,但是意味着BroadcastReceiver器,不能使用结果或中止
  • 有序广播 (发送 Context.sendOrderedBroadcast )交付给一个BroadcastReceiver。 因为每个BroadcastReceiver执行后返回值,它可以传播到下一个BroadcastReceiver,也可以完全通过abortBroadcast()方法终止广播,这样它就不会通过再通过后面的BroadcastReceiver两人。 在清单文件中可以控制运行 android:priority="" 的属性匹配intent-filter;BroadcastReceiver相同的优先级将运行在一个任意的顺序。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

public class MainActivity extends Activity
{

    private Button
bt_start;

    protected void onCreate(Bundle
savedInstanceState) {

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        bt_start
= (Button) 
this.findViewById(R.id.bt_start);

        bt_start.setOnClickListener(new View.OnClickListener()
{

            public void onClick(View
v) {

                Intent
intent = 
new Intent();

                intent.setAction("abc");

                intent.putExtra("name""hello,BroadcastReceivcer");

                sendBroadcast(intent);

            }

        });

    }


1

2

3

4

public void onReceive(Context
arg0, Intent intent) {

    String
name = intent.getStringExtra(
"name");

    System.out.println("one=======" +
name);

}


1

2

3

4

5

<receiver android:name="com.example.broadcast_order.One" >

    <intent-filter android:priority="10" >

        <action android:name="abc" />

    </intent-filter>

</receiver>


1

2

3

4

5

6

7

8

public class Two extends BroadcastReceiver
{

    public void onReceive(Context
arg0, Intent intent) {

        String
name = intent.getStringExtra(
"name");

        System.out.println("Two=======" +
name);

        //
取消Broadcast继续传递

        abortBroadcast();

    }

}


1

2

3

4

5

<receiver android:name="com.example.broadcast_order.Two" >

    <intent-filter android:priority="12" >

        <action android:name="abc"/>

    </intent-filter>

</receiver>

二、Receiver的生命周期

由于BroadcastReceiver本质上属于一个监听器,因此实现BroadcastReceiver的方法也十分简单,只要重写BroadcastReceiver方法中的onReceiv(Content content,Intent intent)方法即可。

每次系统Broadcast事件发生后,系统就会创建对应的BroadcastReceiver的实例,并且自动触发他的onReceive()方法,onReceive()方法执行完后,Broadcast的实例就会被销毁。也就是说Broadcast的生命周期就是onReceive()这个方法。

如果Broadcast的onReceive()方法不能在10秒内执行完成,Android会认为该程序无响应。所以不要在BroadcastReceiver的onReceive()方法中执行一些耗时操作,否则会弹出ANR的对话框。若必须要执行比较耗时的操作,则要考虑Intent的启动一个Service来完成操作。不应该考虑使用新线程去完成耗时的操作,因为BroadcastReceiver的生命周期太短了。

三、Receiver实现电池电量监控


1

2

3

4

5

6

7

8

9

10

11

12

13

protected void onCreate(Bundle
savedInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    bt_startbroadcast
= (Button) 
this.findViewById(R.id.bt_startbroadcast);

    bt_startbroadcast.setOnClickListener(new View.OnClickListener()
{

        public void onClick(View
v) {

            //
指定Broadcast能匹配Intent的方法有两种,一种是清单文件中写配置,一种是代码指定如下

            IntentFilter
filter = 
new IntentFilter(Intent.ACTION_BATTERY_CHANGED);

            myBroadcast
receiver = 
new myBroadcast();//
new出自定义BroadcastReceiver的类

            registerReceiver(receiver,filter);

        }

    });

}


1

2

3

4

5

6

7

8

public void onReceive(Context
context, Intent intent) {

    if (intent.getAction().equals(intent.ACTION_BATTERY_CHANGED))
{

        //
获取当前电量

        int level
= intent.getIntExtra(
"level"0);

        //
获取总的电量

        int scale
= intent.getIntExtra(
"scale"100);

        Toast.makeText(context, "电池电量为:" +
((level * 
100)
/ scale) + 
"%"1).show();

    }

注意要在清单文件中添加获取电量权限状态的权限:    <uses-permission android:name="android.permission.BATTERY_STATS"/>

四、开机自动运行

在自定义的BroadcastReceiver中启动activities或Service


1

2

3

4

5

public void onReceive(Context
context, Intent intent) {

    Intent
intent1 = 
new Intent(context,
BootActivity.
class);

    intent1.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//注册Activity时要使用setFlag()。Service不用

    context.startActivity(intent1);

}

清单文件中注册Receiver


1

2

3

4

5

6

<receiver android:name="com.example.BroadcastReceiverDemo.myBroadcast" >

    <intent-filter>

        <action android:name="android.intent.action.BOOT_COMPLETED" />

        <category android:name="android.intent.category.HOME" />

    </intent-filter>

</receiver>

增加开机访问的权限:<uses-permission android:name="android.permission.BATTERY_STATS" />

Android BroadcastReceiver基础详解一

时间: 2024-08-05 15:24:30

Android BroadcastReceiver基础详解一的相关文章

Android Activity基础详解

一.Activity简介 Activity 是一个应用组件,用户可与其提供的屏幕进行交互,以执行拨打电话.拍摄照片.发送电子邮件或查看地图等操作. 每个 Activity 都会获得一个用于绘制其用户界面的窗口.窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上. 一个应用通常由多个彼此松散联系的 Activity 组成. 一般会指定应用中的某个 Activity 为"主" Activity,即首次启动应用时呈现给用户的那个 Activity. 而且每个 Activity 均可启动另

android屏幕适配详解

android屏幕适配详解 官方地址:http://developer.android.com/guide/practices/screens_support.html 一.关于布局适配建议 1.不要使用绝对布局 2.尽量使用match_parent 而不是fill_parent . 3.能够使用权重的地方尽量使用权重(android:layout_weight) 4.如果是纯色背景,尽量使用android的shape 自定义. 5.如果需要在特定分辨率下适配,可以在res目录上新建layout

Android 四大组件 详解

[置顶] Android四大组件详解 分类: Android四大组件2013-02-09 16:23 19411人阅读 评论(13) 收藏 举报 Android开发 注:本文主要来自网易的一个博主的文章,经过阅读,总结,故留下文章在此 Android四大基本组件介绍与生命周期 Android四大基本组件分别是Activity,Service服务,Content Provider内容提供者,BroadcastReceiver广播接收器. 一:了解四大基本组件 Activity : 应用程序中,一个

Android中Context详解 ---- 你所不知道的Context

转载至 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context

Android中Context详解 ---- 你所不知道的Context (转载)

Android中Context详解 ---- 你所不知道的Context (转载) http://blog.csdn.net/qinjuning 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打交道,例如:Service.BroadcastReceiver.Activity等都会利用到Context的相关方法 : 说它陌生,完全是 因为我们真正的不懂Context的原理.类结构关系.一个简单的问题是,一个应用

Android Service使用详解

Service是Android系统中的四大组件之一,主要有两个应用场景:后台运行和跨进程访问.Service可以在后台执行长时间运行操作而不提供用户界面,除非系统必须回收内存资源,否则系统不会停止或销毁服务.服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行. 此外,组件可以绑定到服务,以与之进行交互,甚至是执行进程间通信 (IPC) 需要注意的是,Service是在主线程里执行操作的,可能会因为执行耗时操作而导致ANR 一.基础知识 Service可以分为以下三种形式

Android中Context详解 ---- 你所不知道的Context(转)

Android中Context详解 ---- 你所不知道的Context(转)                                              本文出处 :http://blog.csdn.net/qinjuning 前言:本文是我读<Android内核剖析>第7章 后形成的读书笔记 ,在此向欲了解Android框架的书籍推荐此书. 大家好,  今天给大家介绍下我们在应用开发中最熟悉而陌生的朋友-----Context类 ,说它熟悉,是应为我们在开发中 时刻的在与它打

Android进阶——Preference详解之Preference系的基本应用和管理(二)

引言 前面一篇文章Android进阶--Preference详解之初识Preference及Preference系(一)简单描述下了Preference的家族构成和基本知识,相信对于Preference早已不会陌生,肯定也跃跃欲试了吧,这篇文章就给大家总结下Preference.PreferenceActivity.PreferenceGroup.RingtonePreference的普通应用和管理,还有通过一些测试来验证一些机制和原理. 一.PreferenceActivity 1.Prefe

android:ToolBar详解

这篇文章因为是台湾人写的,语言风格很别致.本文在原文的基础上做了一些微调(主要是繁体字的问题). 今年(2014) 的 google i/o 发表令多数人为之一亮的 material design,而 google 也从「google i/o 2014」 开始,大家也陆陆续续地看到其更新的 android app 皆套用了这个设计介面.当然,这个设计介面著实让大家感到惊艳外,更让 android 开发者开始担心未来 app 的界面处理了. 不过,所幸有着之前 actionbar 的经验后,and