Android开发22——广播接收者BroadcastReceiver的原理和注册方式

一、广播机制的基本概念

当某个事件产生时(如一条短信发来或一个电话打来),android操作系统会把这个事件广播给所有注册的广播接收者,需要处理这个事件的广播接收者进行处理。其实这就是日常生活中的广播。发生一个新闻后,广播电台会广播这个新闻给打开收音机的人,对这个新闻感兴趣的人会关注,可能会拿笔记下。新闻就是事件,广播电台就是android系统,打开收音机的人就是广播接收者,感兴趣的人就是需要处理该事件的广播接收者,拿笔记下就是对该事件进行的操作。

 

二、广播的分类——普通广播和有序广播

①普通广播:完全异步,逻辑上可以被任何广播接收者接收到。优点是效率较高。缺点是一个接收者不能将处理结果传递给下一个接收者,并无法终止广播intent的传播。

②有序广播:按照被接收者的优先级顺序,在被接收者中一次传播。比如有三个广播接收者A,B,C,优先级是A > B > C。那这个消息先传给A,再传给B,最后传给C。每个接收者有权中终止广播,比如B终止广播,C就无法接收到。此外A接收到广播后可以对结果对象进行操作,当广播传给B时,B可以从结果对象中取得A存入的数据。如系统收到短信发出的广播就是有序广播。

 

三、注册广播接收者的两种方式

①在AndroidManifest.xml中注册

在配置文件中注册的接收者的特点是即使应用程序已被关闭,该接收者依然可接受它感兴趣的广播,比如手机电池电量的广播接收者,没有必要将某个程序开启。下面的例子1、2广播接收者会接收到拨打电话的广播。

    <application android:icon="@drawable/icon" android:label="@string/app_name">
        <activity android:name=".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>

        	<!-- 广播接收者1-->
		<receiver android:name=".BroadcastReceiver1">
			<intent-filter>
				<action android:name="android.intent.action.CALL"></action>
			</intent-filter>
		</receiver>

		<!-- 广播接收者2 -->
		<receiver android:name=".BroadcastReceiver2">
			<intent-filter>
				<action android:name="android.intent.action.CALL"></action>
			</intent-filter>
		</receiver>

		<!-- 广播接收者3 -->
		<receiver android:name=".BroadcastReceiver3">
			<intent-filter>
				<action android:name="android.intent.action.PICK"></action>
			</intent-filter>
		</receiver>

    </application>
/**
 * 模拟拨打电话广播
 *
 * @author 徐越
 *
 */
public class MainActivity extends Activity
{

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
		Intent intent = new Intent();
		intent.setAction("android.intent.action.CALL");
		this.sendBroadcast(intent);
	}
}

/**
 * 每次接收广播都会生成新的BroadcastReceiver1,当处理完onReceive方法后就不会再被使用
 * 再次接收就在生成新的BroadcastReceiver1对象
 *
 * @author 徐越
 *
 */
public class BroadcastReceiver1 extends android.content.BroadcastReceiver
{
	public BroadcastReceiver1()
	{
		Log.i("xy_Receiver", "construtor1");
	}

	@Override
	public void onReceive(Context context, Intent intent)
	{
		Log.i("xy_Receiver", "onReceive1");
	}

}

/**
 * 广播接收者2
 *
 * @author 徐越
 *
 */
public class BroadcastReceiver2 extends android.content.BroadcastReceiver
{
	public BroadcastReceiver2()
	{
		Log.i("xy_Receiver", "construtor2");
	}

	@Override
	public void onReceive(Context context, Intent intent)
	{
		Log.i("xy_Receiver", "onReceive2");
	}

}

/**
 * 广播接收者3
 *
 * @author 徐越
 *
 */
public class BroadcastReceiver3 extends android.content.BroadcastReceiver
{

	public BroadcastReceiver3()
	{
		Log.i("xy_Receiver", "construtor3");
	}

	@Override
	public void onReceive(Context context, Intent intent)
	{
		Log.i("xy_Receiver", "onReceive3");
	}

}

②在Activity中注册

在Activity中绑定接收者必须依附该应用程序存在,或者一个BroadcastReceiver用于更新UI,就没有必要再程序关闭时接收者还运行,故无需在AndroidManifest.xml中注册而可以放在Activity中注册。

/**
 * Activity中注册广播接收者
 *
 * @author 徐越
 *
 */
public class MainActivity extends Activity
{
	private BroadcastReceiver receiver;
	private static final String CALL_ACTION = "android.intent.action.CALL";

	@Override
	public void onCreate(Bundle savedInstanceState)
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.main);
	}

	/**
	 * 模拟发送一个电话的广播
	 *
	 * @param v
	 */
	public void sendBroadCast(View v)
	{
		Intent intent = new Intent();
		intent.setAction("android.intent.action.CALL");
		this.sendBroadcast(intent);
	}

	public void bindReceiver(View v)
	{
		receiver = new BroadcastReceiver();
		IntentFilter intentFilter = new IntentFilter();
		intentFilter.addAction(CALL_ACTION);
		this.registerReceiver(receiver, intentFilter);
	}

	public void unBindReceiver(View v)
	{
		this.unregisterReceiver(receiver);
	}
}

public class BroadcastReceiver extends android.content.BroadcastReceiver
{

	@Override
	public void onReceive(Context context, Intent intent)
	{
		Log.i("xy", "receiver");
	}

}

 

 

时间: 2024-11-02 23:21:51

Android开发22——广播接收者BroadcastReceiver的原理和注册方式的相关文章

深入Android中BroadcastReceiver的两种注册方式(静态和动态)详解_Android

今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户

深入Android中BroadcastReceiver的两种注册方式(静态和动态)详解

今天我们一起来探讨下安卓中BroadcastReceiver组件以及详细分析下它的两种注册方式. BroadcastReceiver也就是"广播接收者"的意思,顾名思义,它就是用来接收来自系统和应用中的广播.在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能:当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作:当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户

Android开发之基本控件和四种布局方式详解_Android

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

Android开发之基本控件和四种布局方式详解

Android中的控件的使用方式和iOS中控件的使用方式基本相同,都是事件驱动.给控件添加事件也有接口回调和委托代理的方式.今天这篇博客就总结一下Android中常用的基本控件以及布局方式.说到布局方式Android和iOS还是区别挺大的,在iOS中有Frame绝对布局和AutoLayout相对布局.而在Android中的布局方式就比较丰富了,今天博客中会介绍四种常用的布局方式.先总结一下控件,然后再搞一搞基本方式,开发环境还是用的Mac下的Android Studio.开始今天的正题, 虽然A

android 开发 java写的 tcp 通信库,注册选择器时异常!跪求java高手指点!!!

问题描述 android 开发 java写的 tcp 通信库,注册选择器时异常!跪求java高手指点!!! public void initialize() throws IOException { boolean done = false; try { Log.e(TAG,"SocketChannel.open:IP:["+hostIp+"Port:"+hostListenningPort+"]."); // 打开监听信道并设置为非阻塞模式 s

BroadcastReceiver广播接收者(二)——利用AndroidManifest.xml注册广播接收者

MainActivity如下: package cc.testbroadcasta; import android.os.Bundle; import android.app.Activity; import android.content.Intent; /** * Demo描述: * 利用AndroidManifest.xml注册广播接收者 */ public class MainActivity extends Activity { @Override protected void onC

Android开发之广播机制浅析

对于了解Android程序设计的人都知道,广播是Android开发中的一个重要的功能,在Android里面有各式各样的广播,比如:电池的状态变化.信号的强弱状态.电话的接听和短信的接收等等,今天本文就来给大家简单介绍一下系统发送.监听这些广播的机制. Android中的广播机制基本如下图所示: 那广播在Android程序中到底是如何运行的呢?下面将以代码的形式给大家好好分析一下: 一.发送广播 Intent是Activity中发送广播的桥梁,通过他我们可以轻松的将广播发送到系统中,具体的实现如下

Android开发入门(九)用户界面 9.3 注册事件监听器

当用户与视图views进行交互的时候,views也会触发事件.举个例子,当用户点击了一个按钮,你需要为 这个事件服务,只有这样,才能去执行某些适当的行为.如果想这么做的话,你就需要为视图views注册监听 . 使用上一节中的例子,在activity中有两个Button.我们可以使用一个匿名的类,为按钮设置点击 事件. public class UIActivityActivity extends Activity { /** Called when the activity is first c

Android开发中内存缓存LruCache实现原理及实例应用

先分析内存缓存是如何实现的,开始进入正题. BitmapUtils内存缓存的核心类LruMemoryCache,LruMemoryCache代码和v4包的LruCache一样,只是加了一个存储超期的处理,这里分析LruCache源码.LRU即Least Recently Used,近期最少使用算法.也就是当内存缓存达到设定的最大值时将内存缓存中近期最少使用的对象移除,有效的避免了OOM的出现. 讲到LruCache不得不提一下LinkedHashMap,因为LruCache中Lru算法的实现就是