全栈工程师开发手册 (作者:栾鹏)
定义广播接收器
这里定义了一个广播接收一个系统屏幕选装的广播事件和一个自定义事件
import android.content.Intent;
import android.net.Uri;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.util.Log;
public class BroadcastReceiver1 extends BroadcastReceiver {
public final static String key1 = "str_key";
public final static String key2 = "double_key";
public static final String action_name = "com.lp.intent.name1";
@Override
public void onReceive(Context context, Intent intent) {
//获取事件名称
String action_name = intent.getAction();
Log.v("广播接收", "事件名称:"+action_name);
if (action_name.equals("android.net.conn.CONNECTIVITY_CHANGE")){
Log.v("广播接收","网络状态发生了变化");
}
if (action_name.equals("com.lp.intent.name1")) {
//从intent中获得lifeform的细节
Uri data = intent.getData();
String str_value = intent.getStringExtra(key1);
double double_value = intent.getDoubleExtra(key2, 0);
if (str_value.equals("value1")) {
Log.v("广播接收",str_value);
}
}
}
}
注册广播接收器
方法1:通过AndroidManifest.xml文件注册
在AndroidManifest.xml文件中注册接收处理系统广播、自定义广播的广播接收器。不同的广播接收事件还需要不同的权限,这里需要添加网络权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<!-- 注册BroadcastReceiver,这种注册方式当应用程序未启动或被终止,也能接收 -->
<receiver android:name="com.lp.app.intent.BroadcastReceiver1">
<intent-filter>
<!-- intent-filter指定要监听的动作字符串,这里添加所有(category)网络连接事件和一个(action)自定义事件 -->
<category android:name="android.net.conn" />
<action android:name="com.lp.intent.name1" />
</intent-filter>
</receiver>
方法2:在窗口中动态注册广播接收
//使用Intent来广播事件。参数标准一般设置在接收文件中。
private IntentFilter filter = new IntentFilter("com.lp.intent.name1"); //IntentFilter用来设置能够触发广播接收的事件信息。初始化时可以添加一个监听事件名称
private BroadcastReceiver1 receiver = new BroadcastReceiver1();
//在窗口运行时才启动接收器,便于更新UI的广播器
@Override
public synchronized void onResume() {
super.onResume();
//注册广播接收,也可以在manifest中注册
filter.addCategory("android.net.conn"); //addCategory添加一系列监听事件
filter.addCategory("android.net.conn.CONNECTIVITY_CHANGE"); //添加一个监听事件,网络变化事件
registerReceiver(receiver, filter); //参数为接收处理器,和触发接收机的条件。
Log.v("广播", "注册了广播接收");
super.onResume();
}
@Override
public synchronized void onPause() {
//取消广播接收
unregisterReceiver(receiver);
Log.v("广播", "注销了广播接收");
super.onPause();
}
发起广播事件给系统
当然你只能发起自定义广播事件给系统其它应用或当前应用
private void Broadcastfun() {
//下面的事件名称和添加属性,我们习惯使用接收器中的常量,是为了发送和接收两端出现不一致。
Intent intent = new Intent(BroadcastReceiver1.action_name); //参数为intent事件名称字符串,用来标识事件唯一性,习惯上使用与包名相同格式
intent.putExtra(BroadcastReceiver1.key1,"value1"); //传递字符串数据
intent.putExtra(BroadcastReceiver1.key2,23.5); //传递浮点数据
sendBroadcast(intent);
Log.v("广播", "发起系统广播");
}
注册定义局部广播接收器
LocalBroadcastManager lbm=LocalBroadcastManager.getInstance(this);
lbm.registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context context, Intent intent) {
Log.v("局部广播", "接收到局部消息");
}
}, new IntentFilter("action_name1"));
发送局部广播
LocalBroadcastManager lbm=LocalBroadcastManager.getInstance(this);
//发送局部广播事件
LocalBroadcastManager lbm1=LocalBroadcastManager.getInstance(this);
lbm1.sendBroadcast(new Intent("action_name1"));
其他
另外广播接收还有
广播有序Intent,sendOrderedBroadcast
广播Sticky Intent,sendStickyBroadcast
Pending Intent,响应将来事件时触发的intent