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