`
1140566087
  • 浏览: 560217 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
博客专栏
2c4ae07c-10c2-3bb0-a106-d91fe0a10f37
c/c++ 入门笔记
浏览量:18571
3161ba8d-c410-3ef9-871c-3e48524c5263
Android 学习笔记
浏览量:314527
Group-logo
J2ME 基础学习课程集
浏览量:18795
A98a97d4-eb03-3faf-af96-c7c28f709feb
Spring 学习过程记录...
浏览量:17597
社区版块
存档分类
最新评论

Android 之 广播BroadcastReceiver

阅读更多
BroadcastReceiver

1. 介绍:四大组件之一,本质就是一个全局监听器;
2. 特性:由于为全局监听器,所以可以方便的实现系统中不同组件之间的通信;
3. 器也会随着关闭; BroadcastReceiver 是系统级别的监听器,拥有自己的进程,只要系统中存在着与之匹配的Intent 被广播出来,BroadcastReceiver 总会被激发;说明:BroadcastReceiver 和 事件处理机制相似,事件处理机制是程序级别的监听器,这些监听器运行在指定程序所在的进程中,当程序退出时,监听
4. 启动:程序是通过sendBroadcast() 方法来启动指定的BroadcastReceiver;
5. 实现:
a) 构建要广播的Intent,然后使用sendBroadcast()  进行发送;
b) 定义广播接收器,继承BoradcaseReceiver 类,重写onReceiver() 方法来响应事件;
6. 注册方式:
a) 静态注册:
1) <receiver android:name=”” >
1. <intent-filter>
a) <action android:name=”android.intent.action.MY_BROADCAST”/>
b) <category android:name=”android.intent.category.DEFAULT/>”
2. </intent-filter>
2) </receiver>
3) 提示:这种方式的注册是常驻型的,当应用程序关闭后,如果有广播信息传来,接收者也会被系统调用而自动运行的;
b) 动态注册:在代码中动态的指定广播地址并进行注册,
1) MyReceiver myreceiver = new MyRecevier();
2) IntentFilter intentFilter = new IntentFilter();
3) intentFilter.addAction(“android.intetn.action.MyReceiver”);
4) registerReceiver(myreceiver,intentFilter); //注册
5) unregisterReceiver(myreceiver);  //注销
6) 注意:动态注册和静态注册相反,不是常驻型的,也就是广播会跟随程序的生命周期;
7. 注意:如果onReceiver() 方法不能在10秒内完成的,则提示该程序无响应,会弹出ANR的对话框;
8. 广播的分类:
a) 普通广播:
1) 优点:可以在同一时刻被所有接受者收到,消息传递的效率高;
2) 缺点:接受者不能将处理结果传递给下一个接收者,并且无法终止Broadcast Intent 的传播;
3) 发送:sendBroadcast();
b) 有序广播:接收者将按预先声明的优先级一次接收Boradcast,优先级 -1000 --- 1000,数值越大优先级别越高;有序广播接收者可以终止Broadcast Intent的传播,一旦终止后面的接收者就不能收到Broadcast;另外,接收者可以将数据传递给下一个接收者;
1) 优先级设置:android:priority=””
2) 代码设置:IntentFilter 对象的setPriority(); 设置
3) 发送:sendOrderedBroadcast();
4) 终止广播:abortBoradcast();
5) 接收者传递信息:setResultExtras(bundle);
6) 下一接收者获取信息:Bundle bundle = getResultExtras(true);
7) 获取Action动作:intent.getAction();
8) 提示:有序广播所有的接收者监控的动作action 相同,优先级决定顺序;
9. 系统广播:系统中定义了很多标准的Broascast Action 来响应系统的广播事件;
a) ACTION_TIME_CHANGED    :  时间改变时触发
b) ACTION_BOOT_COMPLETED  :  系统启动完成后触发,比如开机自启软件;
c) ACTION_PACKAGE_ADDED    :  添加包时触发
d) ACTION_BATTERY_CHANGED  :  电量低时触发;
e) 常量值例如:android.intent.action.BOOT_COMPLETED
f) ACTION_TIME_CHANGED   时间改变
g) ACTION_DATE_CHANGED   日期改变
h) ACTION_MEDIA_EJECT 插入或拔出外部媒体
i) ACTION_MEDIA_BUTTON    按下媒体按钮;
j) ACTION_PACKAGE_REMOVED  删除包



事例如下:
首先看mainfest 配置文件中的配置:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.sun.broadcastreceiver"
    android:versionCode="1"
    android:versionName="1.0" >

    <uses-sdk
        android:minSdkVersion="10"
        android:targetSdkVersion="10" />

    <!-- 定义:该应用的访问权限 -->
    <permission
        android:name="android.permission.MY_BROADCAST_RECEIVER"
        android:protectionLevel="normal" >
    </permission>
    <!-- 使用:声明使用的权限 -->
    <uses-permission android:name="android.permission.MY_BROADCAST_RECEIVER" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name="com.sun.broadcastreceiver.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>

        <!-- 使用静态方式注册广播接收者 , 监听动作:android.sun.MY_BROADCASE_RECEIVER -->
        <receiver android:name=".MyBroadcastReceiver" >
            <intent-filter>

                <!-- 监听的意图 -->
                <action android:name="android.sun.MY_BROADCAST_RECEIVER" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

        <!--
             有序广播 :使用 定义优先级:-1000 至 1000 的值,值越大优先级越高,先执行  android:priority="800" 
        	所有的接收者指定相同的意图,才能保证广播的传递
        -->
        <receiver android:name=".MyOrderBroadcastReceiverOne" >
            <intent-filter android:priority="800" >
                <action android:name="android.intent.action.MY_ORDER_BROADCAST" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <!-- 优先级为:android:priority="900" -->
        <receiver android:name=".MyOrderBroadcastReceiverTwo" >
            <intent-filter android:priority="900" >
                <action android:name="android.intent.action.MY_ORDER_BROADCAST" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <!-- 优先级为:android:priority="700" -->
        <receiver android:name=".MyOrderBroadcastReceiverThree" >
            <intent-filter android:priority="700" >
                <action android:name="android.intent.action.MY_ORDER_BROADCAST" />

                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
    </application>

</manifest>


布局文件:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <Button
        android:id="@+id/send"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="普通广播发送" />

    <Button
        android:id="@+id/sendOrder"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="有序广播发送" />


</LinearLayout>



主界面Activity 内容:---------------------------------------------------------


package com.sun.broadcastreceiver;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;

import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;

/**
 * 功能实现 -- 普通广播 和 有序广播的发送测试
 * 
 * @author Administrator
 * 
 */
public class MainActivity extends Activity {

	private Button send, sendOrder;

	/**
	 * 获取布局文件中控件的对象
	 */
	public void init() {
		Log.i("msg", "init()...调用");
		send = (Button) findViewById(R.id.send);
		sendOrder = (Button) findViewById(R.id.sendOrder);
	}

	// 程序入口
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		init(); // 初始化

		// 设置监听器
		send.setOnClickListener(listener);
		sendOrder.setOnClickListener(listener);
	}
	
	/***************************************************************************/

	/**
	 * 动作,发送普通广播
	 */
	public void sendAction() {
		Intent intent = new Intent();
		intent.setAction("android.sun.MY_BROADCAST_RECEIVER") ;  // 使用隐士意图进行广播的发送
		intent.putExtra("msg", "我是被发送测试普通广播的");
		sendBroadcast(intent, "android.permission.MY_BROADCAST_RECEIVER");
	}

	/**
	 * 动作:发送有序广播
	 */
	public void sendOrderAction() {
		Intent intent = new Intent();
		intent.setAction("android.intent.action.MY_ORDER_BROADCAST");
		intent.putExtra("msg", "首任接收者");
		sendOrderedBroadcast(intent, "android.permission.MY_BROADCAST_RECEIVER");	
	}

	/** 按钮监听器 */
	private android.view.View.OnClickListener listener = new View.OnClickListener() {

		public void onClick(View v) {
			if (v.getId() == R.id.send) {
				sendAction();
				return;
			}
			if (v.getId() == R.id.sendOrder) {
				sendOrderAction();
			}
		}
	};

	/**--------------------------- Start广播:动态注册 与注销------------------------------------------------------*/
	
	/**
	 * 程序结束后注销广播 -- unregisterReceiver();
	 */
	protected void onDestroy() {
		
		super.onDestroy();
		unregisterReceiver(dynamic);
	}

	/**
	 * 程序运行时注册广播 -- registerReceiver();
	 */
	protected void onResume() {
		super.onResume();
		Log.i("msg", "onResume()...");
		
		// 根据意图创建 Intent 过滤器
		IntentFilter intentFilter = new IntentFilter("android.sun.MY_DYNAMIC_BROADCAST_RECEIVER");
		registerReceiver(dynamic, intentFilter); // 注册
		sendDynamicBoradcast();
	}
	
	/**
	 * 动态注册发送广播
	 */
	public void sendDynamicBoradcast(){
		
		// 根据 广播地址 构建Intent 对象
		Intent intent = new Intent("android.sun.MY_DYNAMIC_BROADCAST_RECEIVER");
		
		sendBroadcast(intent);	// 发送广播
	}
	
	//动态注册--- 接收者
	private BroadcastReceiver dynamic = new BroadcastReceiver() {
		
		public void onReceive(Context context, Intent intent) {
			
			Log.i("msg","动态测试意图:"+intent.getAction());
		}
	};
	/**--------------------------- End 广播:动态注册 与注销------------------------------------------------------*/
}

接收者 1:

/**
 * 广播接收者 -- 收到广播后处理动作
 * @author Administrator
 *
 */
public class MyBroadcastReceiver extends BroadcastReceiver {

	public void onReceive(Context context, Intent intent) {

		Log.i("msg","广播已经收到 onReceive()...");
		String action = intent.getAction(); // 得到意图名称
		String msg = intent.getStringExtra("msg"); //得到发送广播传递的数据
		Log.i("msg","意图:"+action+"  信息:"+msg);
	}
}


接收者二:
/**
 * 有序广播测试 -- 接收者 , 级别:android.pro
 * @author Administrator
 *
 */
public class MyOrderBroadcastReceiverOne extends BroadcastReceiver {

	public void onReceive(Context context, Intent intent) {
			
		Log.i("msg", "接收者one ....");
		Bundle bundle = new Bundle();
		bundle.putString("info","我是从one来的");
		this.setResultExtras(bundle); // 此接收者传递数据给下一个接收者
		abortBroadcast(); // 终止广播	
	}
}


接收者三:
public class MyOrderBroadcastReceiverTwo extends BroadcastReceiver {

	public void onReceive(Context context, Intent intent) {
		
		Bundle bundle = getResultExtras(true);
		Log.i("msg","three:"+this.getResultCode()+"  "+bundle.getString("info"));

	}
}


接收者四:
public class MyOrderBroadcastReceiverThree extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		
		Bundle bundle = getResultExtras(true);
		Log.i("msg","two:"+bundle.getString("info"));
	}

}

分享到:
评论

相关推荐

    Android学习之BroadcastReceiver总结

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它扮演着接收系统或应用广播消息的重要角色。BroadcastReceiver使得应用可以在不运行的情况下,响应系统或其它应用发出的事件,例如系统启动完成...

    广播BroadcastReceiver静态动态有序广播

    在Android系统中,广播BroadcastReceiver是一种非常重要的组件,它允许应用程序接收并响应系统或自定义事件,例如设备连接状态变化、网络可用性更新等。在这个教学demo实例中,我们将深入探讨动态注册、静态注册以及...

    Android BroadcastReceiver接收收到短信的广播

    在 Android 中,BroadcastReceiver 是四大组件之一,负责接收和处理系统级别的广播信息。这些广播信息可以提供各种系统状态信息,如电量低、存储空间不足、开机自启动等。 在 Android 中,BroadcastReceiver 需要...

    android demo,BroadcastReceiver源代码的实现。

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图(Intent)。这个"android demo,BroadcastReceiver源代码的实现"是一个示例,旨在帮助开发者理解...

    Android的BroadcastReceiver简单示例

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听系统或应用程序发布的广播消息。BroadcastReceiver能够使应用在不运行的情况下对特定事件做出响应,从而实现跨应用通信。本示例将详细...

    基于Android系统的BroadcastReceiver广播机制设计源码解析

    本项目深入解析了基于Android系统的BroadcastReceiver广播机制,包含42个文件,其中包括15个XML配置文件、10个PNG图片文件、4个Java源文件和若干其他类型...项目文档详实,适用于对Android广播机制有深入研究的需求者。

    Android之Broadcast, BroadcastReceiver(广播)

    下面将详细阐述Android广播机制以及如何注册BroadcastReceiver。 1. Android广播机制: - 广播分为有序广播和无序广播。有序广播(Ordered Broadcast)按照优先级进行接收,接收者可以拦截并修改广播数据;无序...

    Android广播onReceiver回调更新ui

    "Android广播onReceiver回调更新ui"这个主题主要涉及如何在广播接收器中处理接收到的广播消息,并在用户界面(UI)上做出相应的更新。我们将深入探讨以下几个关键知识点: 1. **广播机制**: Android系统通过发送...

    android中的BroadcastReceiver

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它扮演着接收系统或应用广播消息的重要角色。BroadcastReceiver允许应用程序在不运行的情况下接收并处理系统或自定义广播事件,增强了系统的交互...

    Android BroadcastReceiver实例Demo(有序广播的发送)

    BroadcastReceiver是Android四大组件之一,它可以监听并响应系统广播事件,如设备启动、网络状态变化等。广播分为两种类型:有序广播(Ordered Broadcast)和无序广播(Unordered Broadcast)。有序广播允许接收者...

    Android四大组件——BroadcastReceiver普通广播、有序广播、拦截广播、本地广播、Sticky广播、系统广播

    在Android应用开发中,BroadcastReceiver(广播接收器)是四大组件之一,它是系统用来传递消息和事件的重要机制。BroadcastReceiver可以监听系统或应用程序发送的广播Intent,并在接收到广播时执行相应的操作。以下...

    BroadcastReceiver广播接收器演示demo

    BroadcastReceiver,中文名为广播接收器,是Android系统中四大组件之一,用于接收系统或应用程序发布的广播事件。在Android系统中,任何组件或者服务都可以发送广播,而BroadcastReceiver则可以监听并响应这些广播,...

    Android 广播接收者--BroadcastReceiver

    在Android系统中,广播接收者(BroadcastReceiver)是四大组件之一,它负责监听并响应系统或应用程序发布的广播意图(Intent)。BroadcastReceiver可以帮助我们实现后台运行的任务,即使应用没有在前台运行,也能...

    Android 四大组件之BroadcastReceiver

    BroadcastReceiver是Android中处理系统广播事件的组件。它允许应用程序接收并响应系统或应用程序级别的广播消息,比如设备启动完成、网络状态改变等。BroadcastReceiver分为两种注册方式:静态注册和动态注册。 **...

    android broadcastReceiver 代码示例

    在Android系统中,BroadcastReceiver(广播接收者)是四大组件之一,它负责监听系统或应用程序发布的广播事件,并在接收到广播时执行相应的处理。BroadcastReceiver的使用是Android开发中的重要一环,尤其对于系统...

    Android \BroadCastReceiver 简介

    所以,`BroadcastReceiver` 的生命周期非常短暂,必须高效地处理接收到的广播事件。 在 Android 系统中,`BroadcastReceiver` 是一个关键组件,它允许应用程序对外部事件进行响应,比如系统级别的事件(如电池状态...

    Android蓝牙广播通信

    广播通信在Android中是通过BroadcastReceiver来实现的。BroadcastReceiver可以注册接收特定类型的Intent广播,比如蓝牙设备状态改变、设备连接成功或失败等。为了监控蓝牙设备的状态,我们需要创建一个自定义的...

    Android广播接收者——BroadcastReceiverDemo

    这是一个关于Android中四大组件之一 —— BroadcastReceiver,即广播的一个demo,里面涉及到BroadcastReceiver的两种注册方式,也简单的实现了广播,通过点击按钮发送广播,收到广播后打印日志。

    Android BroadcastReceiver Demo

    在Android系统中,BroadcastReceiver是一种重要的组件,它用于监听并响应系统或应用广播事件。BroadcastReceiver使得应用程序可以在不运行状态下接收并处理系统广播,增强了应用的交互性和响应性。本Demo,"Android ...

Global site tag (gtag.js) - Google Analytics