BroadcastReceiver广播接收器笔记
介绍
四大组件及之一,是一种全局的监听器 用来接收来自系统和应用中的广播 通过获取广播能及时方便的做出相对的反应和操作,如:当电池电量改变时系统会产生一条广播,接收到这条广播就能获取电量,做出相应操作。。。
创建一个广播接收器
创建一个继承于BroadcastReceiver的类 在onReceive()方法中添加要执行的事件
public class MyReceiver extends BroadcastReceiver {
public MyReceiver () {
}
@Override
public void onReceive (Context context, Intent intent) {
Toast.makeText(context, intent.getStringExtra("info" ), Toast.LENGTH_LONG).show();
}
}
注册广播接收器
代码注册
MyReceiver myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.jiaji.broadcasttext.BROADCAST" );
registerReceiver(myReceiver, intentFilter);
AndroidManifest.xm文件中配置
<receiver
android:name =".MyReceiver"
android:enabled ="true" >
<intent-filter >
<action android:name = "com.jiaji.broadcasttext.BROADCAST "/>
</intent-filter >
</receiver >
解除广播:unregisterReceiver(receiver) 如果没有优先级,代码注册会比清单注册优先收到
Normal Broadcasts:默认广播
发送广播:sendBroadcast(intent)
public void sendBroadcastClick (View view)
{
Intent intent = new Intent("com.jiaji.broadcasttext.BROADCAST" );
intent.putExtra("info" , "一个消息" );
sendBroadcast(intent);
}
Ordered Broadcasts:有序广播
设置优先级
AndroidManifest.xml中注册的接收器,在<intent-filter>中添加android:priority属性,范围在(-1000~1000)值越大优先级越高 在java代码中用IntentFIlter对象的setPriority()进行设置优先级 广播接收器能终止有序广播的传播,而一点终止后边的广播接收器将无法接收到Broadcast 发送有序广播sendOrderedBroadcast();第二个参数是因为从安全角度考虑而设置指定权限的接收器才能接收此广播,如果为null则表示没要求 终止广播传递abortBroadcast(); 接收器可以将它的结果对象存入数据(Bundle bundle = new Bundle(); bundle.putString("info2", "MyReceiver添加的数据"); setResultExtras(bundle);
),下一个接收器可以获得这个数据(Bundle bundle = getResultExtras(true); String last = bundle.getString("info2");
)
Sticky Broadcasts:粘性广播
发送出去后会等待广播接收器的启动 添加权限: <uses-permission android:name=”android.permission.BROADCAST_STICKY”/> 发送粘性广播使用:sendStickyBroadcast(intent); 去掉粘性广播使用:removeStickyBroadcast(intent);
接收系统广播
开机启动服务
权限: <uses-permission android:name=”android.permission.RECEIVE_BOOT_COMPLETED” /> 注册广播地址:
<intent-filter >
<action android:name ="android.intent.action.BOOT_COMPLETED" />
</intent-filter >
网络变化
权限: <uses-permission android:name=”android.permission.ACCESS_NETWORK_STATE”/> 注册网路广播地址:
<intent-filter >
<action android:name ="android.net.conn.CONNECTIVITY_CHANGE" />
</intent-filter >
电量变化
电量变化广播 <action android:name=”android.intent.action.BATTERY_CHANGED”/> 在广播接收器中获取电量
int currLevel = intent.getIntExtra(BatteryManager.EXTRA_LEVEL, 0 );
int total = intent.getIntExtra(BatteryManager.EXTRA_SCALE, 1 );
Intent batteryIntent = getApplicationContext().registerReceiver(null , new IntentFilter(Intent.ACTION_BATTERY_CHANGED));
int currLevel = batteryIntent .getIntExtra(BatteryManager.EXTRA_LEVEL, 0 );
int total = batteryIntent .getIntExtra(BatteryManager.EXTRA_SCALE, 1 );
我的感受
广播接收器原来是当注册它后就等待接收广播了O__O “… 优先级差点搞错了,是值越大越先得到广播 第一个接收到广播的接收器向下一个广播发送绑定值,可是第二个接收器老是去不到值为null,原来我发送的是普通广播╮(╯▽╰)╭ 接收系统广播注意有些要加权限
想说的话
博客坚持写,不管怎么样,今后打算学习了新的东西就在这里记录一下,以便今后回顾,也希望小小笔记能帮助你们 如果内容有什么地方不对,请告知,希望大家能一起学习和成长 我们生而为人,既不能活在过去,亦不能活在未来,我们所拥有的,只有一分一秒正在流逝的当下