android中BroadCast广播

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程
广播分一般广播和有序广播,广播接收者注册的话分静态注册和动态注册。
在编写代码的实现上,一般先编写广播接收这端,然后再编写发送广播端。

一、静态注册

静态注册,我们只需编写一个继承BroadcastReceiver,然后在功能清单文件中进行配置即可。

 <receiver android:name="com.hbk.brocastreceivedemo.MyBrocastReceiver1">
    <intent-filter >
         <action android:name="com.hbk.brocastreceivedemo.MyBrocastReceiver1.action"/>
     </intent-filter>
 </receiver>

广播发送根据action的name进行构建Intent对象。

Intent intent = new Intent("com.hbk.brocastreceivedemo.MyBrocastReceiver1.action");
intent.putExtra("author", "huangbaokang");
sendBroadcast(intent);

还可以携带数据,发送广播时,静态注册的话,会每次构建对象(在构造函数中打印日志来验证),然后在onReceive()方法中就可以接受对应参数

	@Override
	public void onReceive(Context context, Intent intent) {
    
    
		String author = intent.getStringExtra("author");
		Log.i("TAG","MyBrocastReceiver1 onReceive()  "+ author );
	}

二、动态注册

package com.hbk.brocastreceivedemo;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.View;
import android.widget.Toast;

public class MainActivity extends Activity {
    
    

	@Override
	protected void onCreate(Bundle savedInstanceState) {
    
    
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
	}
	
	private BroadcastReceiver receiver;
	// 注册广播接收器
	public void registBR(View v ){
    
    
		// 动态注册,不需要在功能清单文件中配置
		if(receiver == null){
    
    
			receiver = new MyBrocastReceiver2();
			IntentFilter filter = new IntentFilter("com.hbk.brocastreceivedemo.MyBrocastReceiver1.action");
			registerReceiver(receiver , filter );
			Toast.makeText(this, "动态注册", 0).show();
		}else{
    
    
			Toast.makeText(this, "已经注册了", 0).show();
		}
	}
	
	// 解注册广播接收器
	public void unRegistBR(View v){
    
    
		if(receiver !=null ){
    
    
			unregisterReceiver(receiver);
			receiver = null;
			Toast.makeText(this, "解注册广播接收器", 0).show();
		} else {
    
    
			Toast.makeText(this, "还没有注册广播接收器", 0).show();
		}
	}
	
	@Override
	protected void onDestroy() {
    
    
		super.onDestroy();
		if(receiver!=null) {
    
    
			unregisterReceiver(receiver);
			receiver = null;
		}
	}
	
}

使用代码的方式,传入IntentFilter,注意动态注册后,如果按退出键会报错,提示需要调用unregisterReceiver,我们可以重写onDestroy方法。进行动态注册的时候,构造函数会执行一次,后续注册的时候,不会执行构造函数,这个是跟静态注册的一个区别。而且动态注册不需要在清单文件进行配置。

三、有序广播

有序广播跟一般广播是有区别的,一般广播,有10个接收端,则发送一次广播,10个接收端同时接收到,没有先后顺序。而有序广播,则有一定的接收顺序,而且可以决定是否中断广播,如果中断了,则后续的接收端将接收不到。
api介绍
sendOrderedBroadcast(Intent intent, String receiverPermission)
我们跟一般广播一样,需要在功能配置清单中进行配置,但是有序广播有一个优先级的配置,并且action的name跟发送广播的要一致。

// 发送有序广播
	public void sendOrderBC(View v){
    
    
		Intent  intent = new Intent("com.hbk.brocastreceivedemo.lover.action");
		intent.putExtra("lover", "zhanglulu");
		sendOrderedBroadcast(intent , null);
	}

在这里插入图片描述
由于MyBrocastReceiver4的优先级更大,则先接收到消息
在这里插入图片描述

如果在MyBrocastReceiver4.java中增加一句中断广播的代码,重新运行,则MyBrocastReceiver3将接收不到广播。
在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/huangbaokang/article/details/112344864