一、BroadcastReceiver是什么?
1、四大组件之一:广播(通知消息)接收器 –要想到在Manifest中注册
2、系统使用了很多广播:通知时间改变(闹钟才会响)、电池电量变低、拍摄了照片、改变了语言;
3、没有用户界面。
只负责向所有在Manifest里的注册者发送广播,需要这个广播的人去接收它。
二、BroadcastReceiver怎么使用?
两种注册方式
BroadcastReceiver的两种注册方式
1、静态注册
<receiver android:name=".TestBroadcastReceiver">
<intent-filter>
<action android:name="com.example.test.broadcast"/>
</intent-filter>
</receiver>
2、动态注册
在onStart方法中注册,在onStop方法中反注册
@Override
protected void onStart() {
super.onStart();
/* 动态注册广播*/
//根据action里的android:name过滤广播。
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(COM_EXAMPLE_TEST_BROADCAST);
registerReceiver(mTestBroadcastReceiver, intentFilter);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(mTestBroadcastReceiver);
}
3、两者的区别:静态注册的广播一直有效,动态注册的广播需要反注册掉,不然注册在内存里,会不断的消耗内存,所以常用动态注册。
如何接收广播onReceive方法
MainActivity类
@Override
public void onClick(View view) {
/* 发送广播 */
Intent intent = new Intent(MainActivity.this,TestBroadcastReceiver.class);
//只发给action为COM_EXAMPLE_TEST_BROADCAST
intent.setAction(COM_EXAMPLE_TEST_BROADCAST);
intent.putExtra("toast", "this is a toast of broadcast");
sendBroadcast(intent);
}
TestBroadcastReceiver类
public class TestBroadcastReceiver extends BroadcastReceiver {
/* 接收广播、处理数据 */
@Override
public void onReceive(Context context, Intent intent) {
if (intent != null){
//判断字符串是否相等TextUtils.equals().
if (TextUtils.equals(intent.getAction(),MainActivity.COM_EXAMPLE_TEST_BROADCAST)){
String toastString = intent.getStringExtra("toast");
Toast.makeText(context,toastString,Toast.LENGTH_SHORT).show();
}
}
}
}
如果在onReceive方法中执行耗时操作会怎样?如何解决?
同Activity、Service一样,new Thread进程。
三、几种类型?
1、Normal broadcasts
2、Ordered broadcasts
3、二者有什么区别?
正常广播,没有顺序,一下子向所有注册者发送广播;有序广播,广播有自己的顺序,根据顺序发送广播。有点像Service和IntentService。
4、Local broadcasts:LocalBroadcastManager 广播不是在系统中而是在某应用中,这样速度会很快;android系统发广播时所有的应用都能收到,消耗手机性能、广播延时。
四、BroadcastReceiver的生命周期
Register – SendBroadcast – onReceive – unRegister。
总结:
1、是什么?
2、怎么用?
3、两种注册方式?
4、几种类型?
5、生命周期
注意事项: 1、适当的用、不要滥用 (消耗性能、广播延时、广播被丢弃等。)
2、可以用LocalBroadcast
该用callback时用callback,要么用LocalBroadcast。