Android中Intent详解(二)之使用Intent广播事件及Broadcast Receiver简介

通过第一篇的讲解,我们已经看到了如何使用Intent来启动新的应用程序组件,但是实际上他们也可以使用sendBroadcast方法来在组件间匿名的广播消息。

作为一个系统级别的消息传递机制,Intent可以在进程之间发送结构化的消息。因此,通过实现Broadcast Receiver来监听和响应应用程序内的这些Broadcast Intent。

通过使用Intent来广播一个事件,可以在不修改原始的应用程序的情况下,让我们开发人员对事件做出反应。Android大量使用了Broadcast Receiver来广播系统事件,如网络连接和短信通知等。

1.使用Intent来广播事件

在应用程序组件中,可以构建希望广播的Intent,然后使用sendBroadcast方法来发送它。

可以对Intent的动作、数据和分类进行设置,从而使Broadcast Receiver能够精确的确定他们的需求。在这种方案中,Intent动作字符串可以用来标识要广播的事件,所以他应该是能够标识事件的唯一的字符串。习惯上,动作字符串使用与Java包名相同的构建方式,如下:

<span style="font-size:14px;">public static final String MY_INTENT_ACTION = "com.happy.demo.test";</span>

如果希望在Intent中包含数据,那么可以使用Intent的data属性指定一个URI,也可可以包含extras来添加额外的基本值。

2.使用Broadcast Receiver来监听广播

Broadcast Receiver可以用来监听Broadcast Intent,但是需要对其进行注册,既可以使用代码方式来注册,也可以在应用程序的manifest.xml文件中进行注册,不管采用哪种方式,都需要使用一个Intent Filter来指定他要监听哪些Intent和数据。

对于包含在manifest.xml文件中的广播接收者 ,在Intent被广播出去的时候,应用程序不一定非要处于运行状态才能接收,他们会被自动的启动。

创建一个新的Broadcast Receiver,需要扩展Broadcast Receiver类并重写onReceive方法来进行自己的处理。比如:

<span style="font-size:14px;">package com.happy.demo;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class MyBroadcastReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub

	}

}
</span>

当接收到一个与在注册接收器时使用的IntentFilter相匹配的Broadcast Intent的时候,就会执行onReceive方法。onReceive处理程序必须要在5秒钟以内完成,否则会显示Force Close对话框。

一般情况下,Broadcast Receiver将会更新内容、启动Service、更新Activity UI或者使用Notification Manager来通知用户。

3.在代码中注册Broadcast Receiver

影响特定Activity的UI的Boradcast Receiver通常在代码中注册,在代码中注册的接收器只会在包含它的应用程序组件运行时相应Broadcast Intent。

在接收器用来更新一个Activity中的UI元素时,一般在onResume中注册接收器,在onPause中注销接收器。代码:

<span style="font-size:14px;">@Override
	protected void onResume() {
		super.onResume();
		registerReceiver(receiver, filter);
	}

	@Override
	protected void onPause() {
		super.onPause();
		unregisterReceiver(receiver);
	}</span>

4.在应用程序的manifets.xml文件中进行注册

要在应用程序的mainfets中包含一个Broadreceiver,可以在application节点中添加一个receiver标签,以及指定要注册的Broadcast Receiver的类名。接收器节点中需要包含一个intent-filter标签来指定要监听的动作字符串。如下:

<span style="font-size:14px;"><receiver android:name="com.happy.demo.MyBroadcastReceiver" >
            <intent-filter>
                <action android:name="com.happy.demo.one" />
            </intent-filter>
        </receiver></span>

5.广播有序的Intent

当Broadcast Receiver接收Intent的顺序十分重要时,特别是当需要将来接收器能够影响将来的接收器收到的Broadcast Intent时,可以使用sendOrderedBroadcast方法,如下:

<span style="font-size:14px;">String requiredPermission = "com.happy.demo.one";
		sendOrderedBroadcast(intent, requiredPermission);</span>

使用这个方法时,Intent将会按照优先顺序被传递给所有具有合适权限的已注册的接收器。可以在manifest.xml中使用android:priority属性指定其权限,值越大,代表优先级越高。

<span style="font-size:14px;"> <receiver
            android:name="com.happy.demo.MyBroadcastReceiver"
            android:permission="android.permission.ACCESS_CHECKIN_PROPERTIES" >
            <intent-filter android:priority="1000" >
                <action android:name="com.happy.demo.one" />
            </intent-filter>
        </receiver></span>

发送有序广播的一种常见例子是广播想要收到其结果数据的Intent。使用sendOrderedBroadcast方法时,可以指定一个将放到接收器队列末尾的接收器,而从保证当Broadacst Receiver已被已注册的有序Broadcast Receiver处理和修改后,它也能接收到该Broadcast Intent。

在这种情况下,对于那些在返回给最后一个接收器之前可能被任何收到广播的接收器修改的Intent结果、数据和extra,为他们指定默认值通常很有帮助。如下:

<span style="font-size:14px;">sendOrderedBroadcast(intent, receiverPermission, resultReceiver, scheduler, initialCode, initialData, initialExtras);</span>

6.广播Stick Intent

Stity Intent是Broadcast Intent的有用变体,可以保存他们最后一次广播的值,并且当有一个新的接收器被注册为接收该广播时,他们会把这些值作为Intent返回。

当调用registerReceiver来指定一个匹配的Sticy Broadcast Intent的Intent Filter时,返回值将是最后一个Intent广播,例如电池电量变化的广播

7.Local Boradcast Manager

局部广播管理器包含在Android Support Library中,用户简化注册Broadcast Inten以及在应程序内的组件之间发送Broadcast Intent的工作。因为局部广播的作用域要小,所以使用它比发送全局广播更加高效,而且也确保了应用程序外部的任何组件都收不到我们的广播Intent,所以也是安全的。与之相同,其他应用程序也不能向我们的接收器发送广播,避免了这些接收器成为安全漏洞。

获取Local Broadcast Manager的方法如下:

<span style="font-size:14px;">LocalBroadcastManager lbm = LocalBroadcastManager.getInstance(getApplicationContext());</span>

注册一个局部广播接收者和注册全局的一样,代码如下:

<span style="font-size:14px;">lbm.registerReceiver(receiver, intentFilter);</span>

要发送一个局部Broadcast Intent,可以使用Local Boradcast Manager的sendBroadcast方法,并传入要广播的Intent。如下:

<span style="font-size:14px;">lbm.sendBroadcast(intent);</span>

8.Pending Intent简介

PendingIntent类提供了一种创建可由其他应用程序在稍晚的时间触发的Intent的机制。

PendingIntent通常用于包装在响应将来的事件时触发的Intent,例如单机Widget或者Notification。

PendingIntent类提供了构建PendingIntent的静态方法,以便启动Activity Service或者广播Intent。

<span style="font-size:14px;">PendingIntent.getActivity(context, requestCode, intent, flags);
		PendingIntent.getService(context, requestCode, intent, flags);
		PendingIntent.getBroadcast(context, requestCode, intent, flags);</span>

PendingIntent类包含了一些静态常量,他们可以用于指定标志,以更新或取消与指定动作匹配的现有PendingIntent,也可以用于指定该Intent是否只触发一次。

时间: 2024-10-21 12:44:15

Android中Intent详解(二)之使用Intent广播事件及Broadcast Receiver简介的相关文章

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中Context详解 ---- 你所不知道的Context(转)

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

Android中Animation详解

Animation从总体来说可以分为两类: Tweened Animations:该类提供了旋转,移动,伸展,淡入淡出等效果 Frame-By-Frame Animations:该类可以创建一个Drawable序列,这些Drawable可以按照指定的事件间隔一个一个显示,和动画片差不多 一.Tweened Animations Tweened Animations也有四种类型: Alpha:淡入淡出效果Scale:缩放效果Rotate:旋转效果Translate:移动效果 设置动画效果可以在XM

Android Widget 开发详解(二)

转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是android的七大组件之一,对widget陌生的朋友可以阅读下我的上篇文章< Android Widget工作原理详解(一)> 今天我们就实现一个可以滑动的widet,熟悉下一个普通widget的开发. 一 创建AppWidgetProvider 此类是widget的控制核心,主要控制添加,删除,更新等.他

Android WebView 开发详解(二)

转载请注明出处  http://blog.csdn.net/typename/article/details/39495409 powered by meichal zhao 概览: Android WebView 做为承载网页的载体控件,他在网页显示的过程中会产生一些事件,并回调给我们的应用程序,以便我们在网页加载过程中做应用程序想处理的事情.比如说客户端需要显示网页加载的进度.网页加载发生错误等等事件. WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChr

Android中AIDL详解

欢迎转载,转载请注明出处http://blog.csdn.net/l664675249/article/details/50649676 介绍 Android Interface Definition Language (AIDL), Android接口定义语言.系统中的进程之间不能共享内存,因此,需要提供一些机制在不同进程之间进行数据通信Interprocess communication (IPC).AIDL就是解决这个问题的. 阅读本文需要了解Service的相关知识,关于Service的

Android中Handle详解

网上发现一片总结很好的就copy过来: Handler有何作用?如何使用? 一 .Handler作用和概念 包含线程队列和消息队列,实现异步的消息处理机制,跟web开发的ajax有异曲同工之妙. 1.运行在某个线程上,共享线程的消息队列: 2.接收消息.调度消息,派发消息和处理消息: 3.实现消息的异步处理: Handler能让你发送和处理消息以及Runnable对象:每个Handler对象对应一个Thread和Thread的消息队列.当你创建一个Handler时,它就和Thread的消息队列绑

Android中BroadCastReceiver详解

BroadcastReceiver的解释 BroadcastReceiver也就是"广播接收者"的意思,它是用来接收来自系统和应用中的广播. 在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制.而BroadcastReceiver是对发送出来的 Broadcast进行过滤接受并响应的一类组件. 下面将详细的阐述如何发送Broadcast和使用BroadcastReceiver过滤接收的过程: (1)首先在需要发送信息的地方,把要发送的信息和用于过滤的信息