BroadcastReceiver是什么,怎么使用?
- 四大组件之一:广播(通知消息)接收器
- 系统使用了很多广播
- 通知时间改变
- 电池电量变低
- 拍摄了照片
- 改变了语言
- 没有用户界面
- extends BroadcastReceiver
BroadcastReceiver的两种注册方式
-
静态注册(常驻广播)
-
在 AndroidManifest.xml中注册
<receiver android:name=".TestBroadcastReceiver"> <intent-filter> <!-- 过滤条件 --> <action android:name=""/> </intent-filter> </receiver>
-
-
动态注册(非常驻广播)
- 在代码中注册
-
两者的区别
-
静态注册:一开始就注册进去了,它是一直有效
优点 : 不受其他组件生命周期影响,即使应用程序被关闭,也可以接收广播
缺点 : 耗电大,占内存
适用场景 : 该广播需要时刻监听时可使用
-
动态注册:注册完成后还要销毁掉,否则它会在内存中不断的消耗内存
优点 : 耗电小,省内存,灵活高
缺点 : 需要手动销毁
适用场景 : 在特定的时间段监听的广播
-
注册广播
发送广播
public class SendBroadcastActivity extends AppCompatActivity {
public static final String COM_EXAMPLE_TEST_BROADCAST = "com.example.test.broadcast";
private TestBroadcastReceiver mTestBroadcastReceiver = new TestBroadcastReceiver();
private Button mSendBroadcastBtn;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_text_broadcast);
mSendBroadcastBtn = findViewById(R.id.send_broadcastBtn);
mSendBroadcastBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// 发送广播
Intent intent = new Intent();
intent.setAction(COM_EXAMPLE_TEST_BROADCAST);
intent.putExtra("toast", "this is my toast of broadcast");
sendBroadcast(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
// 动态注册广播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(COM_EXAMPLE_TEST_BROADCAST);
registerReceiver(mTestBroadcastReceiver, intentFilter);
}
@Override
protected void onStop() {
super.onStop();
unregisterReceiver(mTestBroadcastReceiver);
}
}
接收广播
-
onReceive() 方法
public class TestBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 接收广播,处理数据 if (intent != null) { if (TextUtils.equals(intent.getAction(), SendBroadcastActivity.COM_EXAMPLE_TEST_BROADCAST)) { String toastString = intent.getStringExtra("toast"); Toast.makeText(context, toastString, Toast.LENGTH_SHORT).show(); } } } }
-
如果在onReceive方法中执行耗时操作会怎样?
答:在工作线程 > 10 就会ANR application not response
-
如何解决?
在工作线程 new thread 去做
广播类型
-
Ordered broadcasts
是一种同步执行的广播,在广播发出之后(使用sendOrderedBroadcast方法发送广播),同一时刻只会有一个广播接收者能够接收到这条广播消息,当这个广播接收者的逻辑执行完毕之后,广播才会继续传递,因此这种方式时有先后顺序的。
-
Normal broadcasts
也称标准广播,是一种完全异步执行的广播,在广播发出后(使用sendBroadcast发送广播),所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有先后顺序。
-
有何区别
- 有序广播:可以被拦截 、可以被终止、可以被修改数据(有优先级)
- 无序广播:不可被拦截 、不可被终止(一般开发时使用)
-
常见的广播接收者:
-
短信拦截器广播接收者 (有序,拦截,有优先级,4.4版本以后,广播无法拦截,有序 —>无序,有些定制手机不遵循规范)
-
SD卡状态监听广播接收者 (无序)
-
安装,卸载的广播接收者 (无序)
-
电量低的广播接收者 (无序 )
-
BroadcastReceiver的生命周期
BroadcastReceiver的生命周期从对象调用它开始,到onReceiver() 方法执行完成之后结束。每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver() 方法中执行完就销毁,如果BroadcastReceiver的onReceiver() 方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver() 方法中执行耗时的操作。
如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。 如果我们在Activity中注册了BroadcastReceiver,当这个Activity销毁的时候要主动撤销注册否则会出现异常。
- Register
- SendBroadcast
- onReceive
- unRegister
建议
- 适当的用
- 不要滥用 (广播虽好,可不要贪杯哦 !)
- LocalBroadcast