栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

Android:全局大喇叭,广播机制

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Android:全局大喇叭,广播机制

1. 广播的类型

有两种:
(1)标准广播:是一种完全异步执行的广播,在广播发出去后,所有广播接收器几乎都会在同一时间内收到这条广播消息,多个接收器之间没有先后顺序的区别。
广播的效率较高,也是无法被截断的。
(2)有序广播:是一种同步的广播,同一时刻只会有一个广播接收器能够收到这条消息。 当这个广播接收器中的逻辑执行完成后,广播才会继续传播。
所以是有先后顺序的,优先级高的广播可以先收到广播消息,并且前面的广播接收器可以截断正在传递的广播,这样后面的接收器就无法收到广播消息了。

2. 接收系统广播

Android内置了很多系统级别的广播,比如:
(1)手机开机广播消息
(2)电池电量发生变化广播消息
(3)时间或时区发生改变广播消息

2.1 注册广播的方式

广播接收器可以对自己感兴趣的广播进行注册(收听)
(1)静态注册: 在AndroidManifest.xml中进行注册
优点:可以在未启动时接收广播,比如可以接收系统开机广播
缺点:不够灵活,只能注册全局广播,不能注册本地广播(其实也没有必要)

举例:


 //注册广播处理类名
	
		
		

(2)动态注册:在代码中动态注册,比如在onCreate()中注册,但是必须要及时取消注册,比如在 onDestroy() 方法中。
优点:可以自由的控制注册与注销, 很灵活
缺点:必须在启动程序后才能接收到广播,无法在未启动时接收广播。

举例: 动态注册监听网络变化

onCreate(){
	....
	intentFilter = new IntentFilter();
	intentFilter.addAction("android.net.conn.CONNECTTIVITY_CHANGE"); //系统内置的广播消息
	networkChangeReceiver = new NetworkChangeReceiver();
	registerReceiver(networkChangeReceiver, intentFilter); //动态注册监听网络变化
}

onDestroy(){
	...
	unregisterReceiver(networkChangeReceiver); //取消注册
}
2.2 如何创建一个广播接收器

新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法即可(把具体的逻辑写在这里), 有广播到来时,这个方法就会被执行

class NetworkChangeReceiver extends BoradcastReceiver{

onReceive(Context context, Intent intent){
  //获取系统服务用于管理网络连接
  ConnecttivityManager connectionManager = (ConnecttivityManager)getSystemSerivce(Context.CONNECTTIVITY_CHANGE); //获取系统服务API
  NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
  if(networkInfo != null && networkInfo.isAvailable()){  
	Toast.makeText(context, "network changes, network is avaiable.", Toast.LENGTH_SHORT).show();
  }else{
	Toast.makeText(context, "network changes, network is unavaiable.", Toast.LENGTH_SHORT).show();
  }
}

【注意】:
(1)APP要访问一些关键系统信息,需要在AndroidManifest.xml中声明需要使用的权限

(2)在onReceive()方法中不要写过多的逻辑,也不要进行任何较耗时的操作,因为在广播接收器中是不允许开启线程的
一般情况在在接收器中去打开程序的其它组件,比如创建一条状态栏通知,或者启动一个服务等

2.3 发送标准广播
(1)先定义接收器逻辑
	 //注册广播处理类名
		
			
			
	
	
	继承并重写onReceive()方法
	onReceive(Context context, Intent intent){
		Toast.makeText(context, "received in MyBroadcastReceiver.", Toast.LENGTH_SHORT).show();
	}
	
(2)定义发送广播消息逻辑
  onCreate(){
	button.setOnClickerListener(
		(View v)->{
			Intent intent = new Intent("com.example.broadcast.MY_BROADCAST");
			sendBroadcast(intent); //发送全局广播接口
		}
	)
  }
2.4 发送有序广播

与标准广播的主要区别点:
(1)发送方:调用系统API接口不同,调用 sendOrderdBroadcast(intent, null); //第二个参数与权限有关的描述
(2)接收方:

	 //注册广播处理类名
		 //定义优先级,数字越大,优先级越高
			
			
	

(3)截断广播消息继续传递
只要广播接收者调用 abortBroadcast()接口即可。

3. 使用本地广播

本地广播的好处: 本地广播只能在APP内部进行传递,并且广播接收器也只能接收来自本应用发出的广播,安全性较高。
本地广播不能通过静态方式注册来接收,因为发送本地广播时,APP时肯定已经启动了,所以也完全不需要使用静态注册的功能。

本地广播通过LocalBroadcastManager进行管理
举例如下: 自己发,本地自己处理的场景

onCreate(){

	...
	localBroadcastManager = LocalBroadcastManager localBroadcastManager.getInstance(this); //获取实例
	...
	button.setOnClickerListener(
		(View v)->{
			Intent intent = new Intent("com.example.broadcast.LOCAL_BROADCAST");
			localBroadcastManager.sendBroadcast(intent); //发送本地广播接口
		}
	)
	
	interFilter = new IntentFilter();
	intentFilter.addAction("com.example.broadcast.LOCAL_BROADCAST");
	localReceiver = new LocalReceiver();
	localBroadcastManager.registerReceiver(localReceiver, intentFilter); //注册本地广播监听器
	
}	


onDestroy(){
	localBroadcastManager.unregisterReceiver(localReceiver); //取消注册本地广播监听器
}

//定义接收器处理类
class LocalReceiver extends BroadcastReceiver{
	@override
	publicvoid onReceive(Context context, Intent intent){
		Toast.makeText(context, "received local broadcast.", Toast.LENGTH_SHORT).show();
	}
}


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1003575.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号