Anroid 四大组件学习之BroadcastReceiver三

本节学习广播的分类。 广播分为无序广播和有序广播

无序广播:

广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都可以收到这条广播,并且没有先后顺序,可以认为是同时收到

有序广播:

广播发送者的action与广播接收者的action都匹配的话,所以广播介绍者都可以收到这条广播,但是有先后顺序,高优先级的先收到

既然知道什么是无序广播和有序广播后, 那我们举例说明:

那我们模拟生活中一个例子说明。 某高校正在举行体操比赛。这时候我们伟大的计算机学院就开会了。 院长将几个班级的导员开会完,导员又组织各个班的班长开会,最后各个班级的班长给大家传达会议精神。

我们假设: 某某某高校校长是这次广播的发送者,计算机学院的院长,导员和各个班的班长是广播接收者

先用无序广播举例:

第一: 创建校长应用程序,也就是广播的发送者:

public class PresidentActivity extends Activity {

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

    public void sendBroadcast(View v)
    {
    	Intent intent = new Intent();
    	intent.setAction("com.demo.SPORT_MEET_SPIRIT");
    	intent.putExtra("SPORT_MEET", "每个学生早上7点必须上早操");
    	sendBroadcast(intent);
    }
}

第二: 创建计算机学校院长接收者,也就是广播的接收者

public class ComputerPresidentReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		String spirit = intent.getExtras().getString("SPORT_MEET");
		Log.i("TeacherReceiver", "校长说: "+spirit);
	}

}

第三:创建导员接收者,也就是广播的介绍者

public class TeacherReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		String spirit = intent.getExtras().getString("SPORT_MEET");
		Log.i("TeacherReceiver", "院长说: "+spirit);
	}
}

第三:创建最不听话的计算机同学接收者,也就是广播的接收者:

public class StudentReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		//得到广播的数据
		String spirit = intent.getExtras().getString("SPORT_MEET");
		//显示
		Log.i("StudentReceiver", "导员说: "+spirit);
	}
}

此时清单文件中配置为:

        <receiver android:name="com.demo.broadcastreceiveractivity.ComputerPresidentReceiver">
            <intent-filter >
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>
        <receiver android:name="com.demo.broadcastreceiveractivity.TeacherReceiver">
            <intent-filter >
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>
        <receiver android:name="com.demo.broadcastreceiveractivity.StudentReceiver">
            <intent-filter >
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>

ok。当我们校长发送广播后:看看现象:

可以看到先是校长说,然后院长说,再然后是导员说。看起来好像挺有顺序的。但是我将配置文件的顺序改为:

        <receiver android:name="com.demo.broadcastreceiveractivity.StudentReceiver">
            <intent-filter >
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>
        <receiver android:name="com.demo.broadcastreceiveractivity.TeacherReceiver">
            <intent-filter >
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>
        <receiver android:name="com.demo.broadcastreceiveractivity.ComputerPresidentReceiver">
            <intent-filter >
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>

学生放在最前面注册,则结果为:

这时候顺序明显不对了。 这就是无序广播的特点,对于接受没有先后顺序。这明显和实际不符合。要想做到符合就必须用有序广播

举例有序广播:

首先: 给每个广播接受者设置权限,权限是-1000到1000。其中1000的优先级最高

        <receiver android:name="com.demo.broadcastreceiveractivity.StudentReceiver">
            <intent-filter android:priority="500">
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>
        <receiver android:name="com.demo.broadcastreceiveractivity.TeacherReceiver">
            <intent-filter android:priority="800">
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>
        <receiver android:name="com.demo.broadcastreceiveractivity.ComputerPresidentReceiver">
            <intent-filter android:priority="1000">
           		 <action android:name="com.demo.SPORT_MEET_SPIRIT"></action>
       		 </intent-filter>
        </receiver>

其次: 发送广播的方式就的改变:

    public void sendBroadcast(View v)
    {
    	Intent intent = new Intent();
    	intent.setAction("com.demo.SPORT_MEET_SPIRIT");
    	//intent.putExtra("SPORT_MEET", "每个学生早上7点必须上早操");

    	//发送的广播为无序广播
    	//sendBroadcast(intent);

    	//发送有序广播
    	sendOrderedBroadcast(intent, null, null, null, 0, "每个学生早上7点必须上早操", null);
    }

然后,就每个接收者做个调整:

计算机院长把校长的话给改了,校长说计算机要当第一必须6点半起来:

public class ComputerPresidentReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		//如果发送的时候数据是通过intent发送的,就通过intent取得
		//String spirit = intent.getExtras().getString("SPORT_MEET");

		//如果不是,就是简单的字符串的话,可以通过getResultData得到
		String spirit = getResultData();
		Log.i("ComputerPresidentReceiver", "校长说: "+spirit);
		setResultData("每个学生早上6点半必须上早操");
	}

}

这时候广播到导员了,导员说计算机系必须当第一,6点起来:

public class TeacherReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		//String spirit = intent.getExtras().getString("SPORT_MEET");
		String spirit = getResultData();
		Log.i("TeacherReceiver", "院长说: "+spirit);
		setResultData("每个学生早上6点必须上早操");
	}

}

这时候班长传达旨意来了:

public class StudentReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		//得到广播的数据
		//String spirit = intent.getExtras().getString("SPORT_MEET");
		//显示
		String spirit = getResultData();
		Log.i("StudentReceiver", "导员说: "+spirit);
		setResultData("谁爱上谁上去,反正我不去!");
	}
}

这时候同学们就说: 谁爱上谁上去,反正我不去!

看一下运行效果:

这样校长的旨意就传达了。但是同学们到底该怎么办呢?  有一天学校的检查部门(也就是一帮臭b学生会,来检查上早操的人数)

这时候我们就需要对发送者在改造:

    public void sendBroadcast(View v)
    {
    	Intent intent = new Intent();
    	intent.setAction("com.demo.SPORT_MEET_SPIRIT");
    	//intent.putExtra("SPORT_MEET", "每个学生早上7点必须上早操");

    	//发送的广播为无序广播
    	//sendBroadcast(intent);

    	//发送有序广播
    	sendOrderedBroadcast(intent, null, new resultReceiver(), null, 0, "每个学生早上7点必须上早操", null);
    }

    //广播的最终接受者
    class resultReceiver extends BroadcastReceiver
    {

		@Override
		public void onReceive(Context context, Intent intent) {
			// TODO Auto-generated method stub
			String spirit = getResultData();
			Log.i("resultReceiver", "计算机上早情况:" + spirit);
		}

    }

演示效果为:

学生会一看,计算机系8点了还没人上早操,就几个胆小的去上了。

这就是有序广播,发送者发送后,第一个接受者可以对广播的内容修改,同时也可以终止广播的继续发送。但是广播的最终接受者是一定可以收到此广播的。

比如: 有一天导员比较忙,忘记了传达会议的精神

public class TeacherReceiver extends BroadcastReceiver {

	@Override
	public void onReceive(Context context, Intent intent) {
		// TODO Auto-generated method stub
		//String spirit = intent.getExtras().getString("SPORT_MEET");
		String spirit = getResultData();
		Log.i("TeacherReceiver", "院长说: "+spirit);

		//由于太忙,忘了,也就不传播会议精神了
		abortBroadcast();
		//setResultData("每个学生早上6点必须上早操");
	}
}

结果为:

导员没有给班长传达会议精神,同学们也没收到, 当然也没人去上早操。但是学生会还是会说到最终的广播消息的。

注意:  如果你发送的是无序广播的话,使用abortBroadcast();是无法终止广播的传送的,对无序广播是没有用的。 同样setResultData也是对无序广播没有用的。

这个大家可以试试。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-26 04:24:40

Anroid 四大组件学习之BroadcastReceiver三的相关文章

Android 四大组件学习之BroadcastReceiver一

本节课学习四大组件最后一个, 广播接受者. 顾名思义广播接受者就是接受广播呗.比如在现实社会中,以前每个人家都有一台收音机,这可就可以去接受广播发出来的消息.大家都知道,程序世界也是参照的显示生活设计出来的,那在Android系统中也引入了广播这个概念.那在Android系统中广播有什么作用呢? 举个例子:比如你正在玩游戏或者看视频突然手机电量过低,这时候就会弹出一个框,提醒您手机电量过低,请充电的提示.其实电量改变就是一种广播类型,当电量过低时,系统就会发生一条广播,这时候正在运行的程序就会收

Android 四大组件学习之BroadcastReceiver四

本节学习系统中特殊的广播接收者. 我们前面几节不是说了,当广播接受者一旦注册到系统中,当系统发送的广播和你注册的广播的action匹配时,系统就会启动广播接收者所在的进程.除非用户手动停止广播接收者所在的进程.但是生活中有这样一种情况,比如说:我在玩网络游戏,假设说游戏本身在系统电量低的情况下,会自动保存当前游戏的进度,也就是存档的.可以这么说,此广播接受者只有在用户玩游戏时才需要启动,别的时候用户是不需要的.如果此广播接收者一直常驻于系统,那不是很浪费系统资源.所以我们就需要动态的启动广播接收

Android 四大组件学习之BroadcastReceiver二

上节学习了如何创建一个广播,也尝试接受系统打电话的广播.本节课学习如何自定义广播.自定义广播实质上也就是创建一个发送广播者,创建一个接受该广播者. 那我们就开始行动吧. 先创建一个发送广播的应用: public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setCont

Android 四大组件学习之Service三

上节我们学习了,如何用StartService启动服务,这节学习如何用BindService启动一个服务 首先看MyActivity的代码部分: public class MyActivity extends Activity { private Button btn_start; private Button btn_end; private MyServiceConnection sConnection; @Override protected void onCreate(Bundle sa

Android 四大组件学习之Activity三

上一节学习了通过Intent去启动另外一个Activity. 本节学习通过Intent传值. 还是依旧创建两个Activity,我依旧是用之前的MainActivity和SecondActivity 先看MainActivity的布局文件,SecondActivity的布局文件就不列出,和上节课一样: <TextView android:id="@+id/textView1" android:layout_width="wrap_content" androi

Android 四大组件学习之ContentProvider三

上节课学习如何自己创建一个ContentProvider,以及用ContentResolver去操作ContentProvider. 今天我们用系统提供的ContentProvider. 先来个简单的,读取系统的短信内容. 根据上节知道,既然要读取系统的短信,那就得先找到系统的短信在那里? 先找到短信数据库所在的问题,然后导出,查看里面的内容 既然已经分析好了,我们需要什么,不需要什么. 当然还需要知道短信提供者给第三方的URL.这个可以通过Android源码查看. 那我们就写一个程序,读取系统

android四大组件学习总结以及各个组件示例(1)

android四大组件分别为activity.service.content provider.broadcast receiver. 一.android四大组件详解 1.activity (1)一个Activity通常就是一个单独的屏幕(窗口). (2)Activity之间通过Intent进行通信. (3)android应用中每一个Activity都必须要在AndroidManifest.xml配置文件中声明,否则系统将不识别也不执行该Activity. (4)Activity生命周期>什么是

Android 四大组件学习之Activity一

Activity是Android四大组件中最基础也是最常用的组件之一.Activity作为一个应用程序组件,提供了一个与用户交互的界面.可以这么说Activity是和用户操作有密切相关的的,常用来负责与用户交互,可以通过setContentView来显示组件. 今天我们学习如何去创建一个Activity 第一步: 创建一个Android Application Project, 填入应用名称,工程名称,包名 点击Next下一步:下面的选择都是默认的. 直到 你就可以选择一个Activity进行创

Android 四大组件学习之ContentProvider一

ContentProvider作为四大组件之一,那它存在一定是有原因的? 那为什么引用ContentProvider呢?  我们先看一个例子. 大家在生活中用手机,比如你按了360手机管家, 其中360手机管家就有一个短信,通话记录,联系人备份的功能.那手机里的短信,联系人都是存放在数据库中的 比如联系人的信息是存放在contacts2.db中.既然数据是存放在数据库中的,那360手机管家就必须拿到这个数据.但是contac2.db对别的用户是没有权限的.那360是如何拿到手机联系人这些信息呢?