博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android-广播接收器(BroadcastReceiver)
阅读量:3943 次
发布时间:2019-05-24

本文共 3301 字,大约阅读时间需要 11 分钟。

BroadcastReceiver是什么,怎么使用?

  • 四大组件之一:广播(通知消息)接收器
  • 系统使用了很多广播
    • 通知时间改变
    • 电池电量变低
    • 拍摄了照片
    • 改变了语言
  • 没有用户界面
  • extends BroadcastReceiver

BroadcastReceiver的两种注册方式

  • 静态注册(常驻广播)

    • 在 AndroidManifest.xml中注册

  • 动态注册(非常驻广播)

    • 在代码中注册
  • 两者的区别

    • 静态注册:一开始就注册进去了,它是一直有效

      优点 : 不受其他组件生命周期影响,即使应用程序被关闭,也可以接收广播

      缺点 : 耗电大,占内存

      适用场景 : 该广播需要时刻监听时可使用

    • 动态注册:注册完成后还要销毁掉,否则它会在内存中不断的消耗内存

      优点 : 耗电小,省内存,灵活高

      缺点 : 需要手动销毁

      适用场景 : 在特定的时间段监听的广播

注册广播

发送广播

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发送广播),所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有先后顺序。

  • 有何区别

    • 有序广播:可以被拦截 、可以被终止、可以被修改数据(有优先级)
    • 无序广播:不可被拦截 、不可被终止(一般开发时使用)
  • 常见的广播接收者:

    1. 短信拦截器广播接收者 (有序,拦截,有优先级,4.4版本以后,广播无法拦截,有序 —>无序,有些定制手机不遵循规范)

    2. SD卡状态监听广播接收者 (无序)

    3. 安装,卸载的广播接收者 (无序)

    4. 电量低的广播接收者 (无序 )

BroadcastReceiver的生命周期

BroadcastReceiver的生命周期从对象调用它开始,到onReceiver() 方法执行完成之后结束。每次广播被接收后会重新创建BroadcastReceiver对象,并在onReceiver() 方法中执行完就销毁,如果BroadcastReceiver的onReceiver() 方法中不能在10秒内执行完成,Android会出现ANR异常。所以不要在BroadcastReceiver的onReceiver() 方法中执行耗时的操作。

如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成。但不能绑定Service。 如果我们在Activity中注册了BroadcastReceiver,当这个Activity销毁的时候要主动撤销注册否则会出现异常。

  • Register
  • SendBroadcast
  • onReceive
  • unRegister

建议

  • 适当的用
  • 不要滥用 (广播虽好,可不要贪杯哦 !)
  • LocalBroadcast

转载地址:http://ukiwi.baihongyu.com/

你可能感兴趣的文章
华为交换机作为AC的条件
查看>>
禁用Ubuntu 15.04登录界面显示客人会话(简单-实用)
查看>>
linux X下安装的软件
查看>>
Linux监测某一时刻对外的IP连接情况
查看>>
CentOS7 最小环境安装Jumpserver 1.0版脚本
查看>>
X-Security X的安全控制
查看>>
openVAS的安装
查看>>
Centos 6.5 初始安装无网卡驱动解决方法
查看>>
linux中的网桥bridge
查看>>
linux中的teaming与bonding
查看>>
LVM
查看>>
用shell切分文件--split
查看>>
python中判断字符是否为中文
查看>>
Python - 利用zip函数将两个列表(list)组成字典(dict)
查看>>
python-全角转半角
查看>>
Python pass语句作用与用法
查看>>
Java double,float设置小数点位数
查看>>
PyCharm & Jupyter
查看>>
为什么要用Jupyter Notebook
查看>>
sklearn中的LogisticRegression模型
查看>>