第五十九讲:四大组件之BroadcastReceiver(二)

没有任何动物比蚂蚁更勤奋,然而它却最沉默寡言。

本讲内容: Broadcast Receiver 广播接收者的使用

上一讲我们讲解了一个接收者来接收广播,如果有多个接收者都注册了相同的广播地址,又会是什么情况呢,这就涉及到普通广播和有序广播的概念了。

一、普通广播(Normal Broadcast)

普通广播对于多个接收者来说是完全异步的,通常每个接收者都无需等待即可以接收到广播,接收者相互之间不会有影响。对于这种广播,接收者无法终止广播,即无法阻止其他接收者的接收动作。

我们新建二个BroadcastReceiver,演示一下这个过程,FirstReceiver、SecondReceiver的代码如下:

public class FirstReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
			Log.i(TAG, "----FirstReceiver----");
	}
}
public class SecondReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
			Log.i(TAG, "----SecondReceiver----");
	}
}

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity implements OnClickListener{
	private Button b;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		b=(Button) findViewById(R.id.b);
		b.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		// 定义一个intent
		Intent intent=new Intent().setAction("android.intent.action.MY_BROADCAST");
		// 广播出去
		sendBroadcast(intent);
	}
}

静态注册

 <receiver android:name=".FirstReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.MY_BROADCAST" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:name=".SecondReceiver" >
            <intent-filter>
                <action android:name="android.intent.action.MY_BROADCAST" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

点击按钮

可看到这二个接收者都接收到这条广播了,如果我们在onReceive方法的最后一行添加以下代码,试图终止广播:

abortBroadcast(); 

再次点击按钮,我们会发现,控制台中二个接收者仍然都打印了自己的日志,表明接收者并不能终止广播。

二、有序广播(Ordered Broadcast)

它每次只发送到优先级较高的接收者那里,然后由优先级高的接受者再传播到优先级低的接收者那里,优先级高的接收者有能力终止这个广播。FirstReceiver、SecondReceiver的代码如下:

public class FirstReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		String msg=intent.getStringExtra("msg");
		Log.i(TAG, "FirstReceiver: "+msg);

		Bundle bundle=new Bundle();
		bundle.putString("msg", msg+"@FristReceiver");
		setResultExtras(bundle);
	}
}

注意:在FirstReceiver中最后都使用了setResultExtras方法将一个Bundle对象设置为结果集对象,传递到下一个接收者那里,这样以来,优先级低的接收者可以用getResultExtras获取到最新的经过处理的信息集合。

public class SecondReceiver extends BroadcastReceiver {
	private static final String TAG = "MyReceiver";
	@Override
	public void onReceive(Context context, Intent intent) {
		String msg=getResultExtras(true).getString("msg");
		Log.i(TAG, "SecondReceiver: "+msg);
	}
}

下面是MainActivity.java主界面文件:

public class MainActivity extends Activity implements OnClickListener{
	private Button b;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		b=(Button) findViewById(R.id.b);
		b.setOnClickListener(this);
	}
	@Override
	public void onClick(View v) {
		Intent intent=new Intent().setAction("android.intent.action.MY_BROADCAST");
		intent.putExtra("msg", "hello receiver");
		sendOrderedBroadcast(intent, "permission.MY_BROADCAST_PERMISSION");
	}
}

注意:使用sendOrderedBroadcast方法发送有序广播时,需要一个权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。这样做是从安全角度考虑的,例如系统的短信就是有序广播的形式,一个应用可能是具有拦截垃圾短信的功能,当短信到来时它可以先接受到短信广播,必要时终止广播传递,这样的软件就必须声明接收短信的权限。

所以我们在AndroidMainfest.xml中定义一个权限:

 <permission android:protectionLevel="normal"
            android:name="permission.MY_BROADCAST_PERMISSION" /> 

然后声明使用了此权限:

<uses-permission android:name="permission.MY_BROADCAST_PERMISSION" />  

静态注册

现在这二个接收者的<intent-filter>多了一个android:priority属性,并且依次减小。这个属性的范围在-1000到1000,数值越大,优先级越高。

      <receiver android:name=".FirstReceiver" >
            <intent-filter android:priority="1000">
                <action android:name="android.intent.action.MY_BROADCAST" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>
        <receiver android:name=".SecondReceiver" >
            <intent-filter android:priority="999">
                <action android:name="android.intent.action.MY_BROADCAST" />
                <category android:name="android.intent.category.DEFAULT" />
            </intent-filter>
        </receiver>

点击按钮

我们看到接收是按照顺序的,第一个在结果集中加入了自己的标记,并且向优先级低的接收者传递下去。

如果我们修改FirstReceiver的代码,在onReceive方法的最后一行添加以下代码,试图终止广播:

abortBroadcast(); 

然后再次运行程序,控制台打印如下:

只有第一个接收者执行了,可以看出广播可以被第一个接收者终止。

本讲就到这里,Take your time and enjoy it

时间: 2024-12-29 12:19:24

第五十九讲:四大组件之BroadcastReceiver(二)的相关文章

第十九讲:ListView与Adapter(二)

会当凌绝顶,一览众山小. -- 杜  甫<望岳> 本讲内容:ListView列表组件 与 Adapter适配器的用法 一.ListView使用SimpleAdapter 很多时候需要在列表中展示一些除了文字以外的东西,比如图片等.这时候可以使用SimpleAdapter.可以通过它 使用simpleAdapter的数据一般都是用HashMap构成的列表,列表的每一节对应ListView的每一行.通过SimpleAdapter的构造函数,将HashMap的每个键的数据映射到布局文件中对应控件上.

四大组件之BroadcastReceiver(二)-使用权限和常用的系统广播

第4节 Broadcast的使用权限 为广播设置权限要考虑两方面的问题. 作为广播的发送者,希望限制广播的接收者,只让特定的应用组件接收到发出的广播: 作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格: 无论是上面哪种情况,解决方法都试一样的:为发送者和接收者都设置一个相同的权限,只有它们的权限匹配上了,广播机制才能产生效果. 4.1 限制接收者 假设组件A要发布广播, 在AndroidManifest.xml文件

QT开发(五十四)———QML组件

QT开发(五十四)---QML组件 QML组件是由基本元素组合成的一个复杂的可重用的组合元素.QML 提供了多种方法来创建组件. 基于文件的组件将QML元素放置在一个单独的文件中,然后给文件一个名字,可以通过名字来使用组件.如果有一个文件名为Cell.qml,就可以在QML中使用Cell { - }形式.自定义组件的文件名的首字母必须大写. Cell.qml文件: import QtQuick 2.0   Item {     id: container     property alias c

linux杂谈(十九):DNSserver的配置(二)

1.本机和外网的解析 ? ?之前讨论了DNS的正向解析和反向解析,但有的时候我们想让DNSserver对于server本机的解析和对于外网的解析是不同的.那就须要在主配置文件里对本机和外网进行不同的配置: ? ? ? ? ? ?这个是主配置文件里对于本server的訪问,而且副配置文件为example.com.zone:(注意要凝视的内容). ? ? ? ?这个是对于非本机的配置,而且副配置文件为example.com.inter. ? ?为了统一期间,把之前的副配置文件的策略凝视掉. ? ?

Android实训案例(六)——四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听

Android实训案例(六)--四大组件之一BroadcastReceiver的基本使用,拨号,短信,SD卡,开机,应用安装卸载监听 Android中四大组件的使用时重中之重,我这个阶段也不奢望能把他所有的原理搞懂,但是最起码的,我要把他的各种使用方法了如指掌才行 BroadcastReceiver 接收系统的广播,比如电话,短信之类的 1.IP拨号器 我们在拨打电话的时候,我们系统也会事先发送一个广播,所以我们可以用广播接收者来接收到这个广播拨打电话的时候在电话号码前面加上一些优惠的长途短号,

一起talk C栗子吧(第一百五十九回:C语言实例--基于AF_INET域的数据报套接字通信)

各位看官们,大家好,上一回中咱们说的是基于AF_INET域的流套接字通信的例子,这一回咱们说的例子是:基于AF_INET域的数据报套接字通信 .闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在上一回中一起制作了我们的第三道佳肴是:基于AF_INET域的流套接字通信.今天,我将和大家一起制作第四道佳肴:基于AF_INET域的数据报套接字通信. 制作第四道佳肴的菜谱:数据报套接字过程. 制作第四道佳肴的食材:数据报套接字的接口,套接字属性,套接字地址信息. 看官们,以上的内容,我们

Android四大组件之BroadcastReceiver详细解析

什么是BroadcastReceiver? BroadcastReceiver作为Android四大组件之一,在实际开发中也发挥着重要的作用,广播机制在Android程序通信中至关重要,广播其实与我们现实生活中的电台很相似,电台在某个频道上发送它的内容,那么只要有在收听这个频道的人都会收到这些内容.在Android中,广播也同样分为两个角色:广播发送者.广播接收者. BroadcastReceiver的应用场景 1.在一个应用中,我们的Activity与Service的通信就需要用到广播来作为中

Android四大组件之~~BroadcastReceiver

声明:转载请注明出处:http://blog.csdn.net/Hello_Chillax/article/details/45672601 开题:对android稍微有些了解的朋友都知道,android中有四大组件,分别是:Activity,Service,ContentProvider,BroadcastReceiver.今天来介绍其一:BroadcastReceiver. BroadcastReceiver:顾名思义,广播接收者,可以接收系统,其他应用等等发送的广播进而做出相应的反应.比如

四大组件之BroadcastReceiver(一)-自定义“收音机”与发送“广播”

第1节 Broadcast Receiver概述 很多时候,我们希望一个应用程序在它没有运行起来的时候,也能感知系统状态的某些变化,如果条件合适,就让这个应用就运行起来. 比如,一个拦截骚扰电话的应用,平时它可能并不需要运行起来,它只关心有电话来的时候,看看这个号码是不是骚扰电话的号码,如果是就给用户发出一个提示,如果不是,那就和它没有关系,啥也不做. 为了实现这类功能,安卓系统引入了四大组件之一的BroadcastReceiver,设计了一套广播与接收的机制, 任何应用或者安卓系统的自身组件可