Android-广播接收器(BroadcastReceiver)

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

  • 有何区别

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

    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
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值