android BroadcastReceiver总结

BroadcastReceiver,广播接收者。Android四大组件之一,它的本质就是一个全局的监听器。可以监听到开机、锁屏、解锁、电话短信、电量变化、网络等系统性广播,以及应用广播,用来实现不同组件之间的通信

在Android中,广播可以分为两大类:标准广播(Normal broadcasts)和有序广播(Ordered broadcasts)

标准广播

也称“普通广播”、“无序广播”,一种异步执行的广播。在广播发出后,只要匹配条件的广播接收者都可以接收到广播。这种广播效率很高,但是没有先后顺序(几乎同时收到),所以不可以被拦截,不可以被终止,不可以被修改

sendBroadcast()
有序广播

有序广播,是一种同步执行的广播。在广播发出后,从优先级别最高的广播接收器开始接收,当这个广播接收器中的逻辑执行完成以后,如果没有丢弃,就下传给下一个次高优先级别的广播接收器进行处理,依次类推,直到最后。如果多个应用程序设置的优先级别相同,则谁先注册的广播,谁就可以优先接收到广播。有序广播可以被终止,数据可以被修改

sendOrderedBroadcast()

在Android中,广播的注册方式可以分两种:动态注册和静态注册(静态注册的广播也称常驻性广播)

创建一个广播接收者 TestReceiver

 class TestReceiver extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
          // TODO 逻辑处理
        }
    }
静态注册广播

TestReceiver 作为外部类,在 AndroidManifest.xml文件中进行注册

1.在 AndroidManifest.xml中声明广播接收者

 <receiver android:name=".receiver.TestReceiver">
        //指定广播意图action,用于过滤广播
         <intent-filter>
                <action android:name="android.intent.action.test_receiver" />
         </intent-filter>
 </receiver>

2.在TestReceiver 中onReceive()方法中功能需求进行相应的逻辑处理

3.在使用静态方式注册广播时,每次接收到广播时,都会重新创建TestReceiver对象,如果TestReceiver中有成员变量,变量的值都会重新为默认值

 public final static String ACTION_TEST_RECEIVER ="android.intent.action.test_receiver";
 class TestReceiver extends BroadcastReceiver {
    public List<String> data;
        @Override
        public void onReceive(Context context, Intent intent) {
          // TODO 逻辑处理
          //在这里判断data是否为null ,其实是没有什么用的,每次接收到广播时,data都会为null
         if (data == null) {
            data = new ArrayList<>();
        } 
    }

    //发送广播
     Intent intent =new Intent();
     intent.setAction(ACTION_TEST_RECEIVER);
     //传递数据
     intent.putExtra("name","数据");
     sendBroadcast(intent);

如果不想TestReceiver中的成员变量值重置,我们可以用关键词 static 修饰变量,但是这样存在一个问题,就是成员变量一直占用着内存,所以我们需要做相应的处理

 class TestReceiver extends BroadcastReceiver {
     //用 static 修饰data
    public static List<String> data;
        @Override
        public void onReceive(Context context, Intent intent) {
          // TODO 逻辑处理
         if (data == null) {
            data = new ArrayList<>();
          } 
       }
          // 置空数据
       public void clearData() {
          data = null;
       }
 }
动态注册广播

TestReceiver 作为为内部类,
1.在代码中实例化注册

 public final static String ACTION_TEST_RECEIVER ="android.intent.action.test_receiver";
 private TestReceiver receiver ;
     @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_receiver);
        //在onCreate()注册,这个并不是一定要在这里注册,根据自己的实际需要
        receiver = new TestReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(ACTION_TEST_RECEIVER);
        registerReceiver(receiver, filter);
    }
     @Override
    protected void onDestroy() {
        super.onDestroy();
        //注意注册了广播,一定要销毁,否则会出现有异常
        if (receiver != null) {
            unregisterReceiver(receiver);
        }
    }

     //发送广播
     Intent intent =new Intent();
     intent.setAction(ACTION_TEST_RECEIVER);
     //传递数据
     intent.putExtra("name","数据");
     sendBroadcast(intent);

2.在TestReceiver 中onReceive()方法中功能需求进行相应的逻辑处理

无论是有序广播还是无序广播都属于系统的全局广播,我们发出的这些广播可以给系统中任何应用程序接收到,当然我们也可以接受其他应用程序的广播。考虑到对单个应用程序而言广播是存在安全性问题的,android系统提供了本地广播机制(LocalBroadcastManager ),发出的广播只能在本应用程序中接收到

LocalBroadcastManager mManager= LocalBroadcastManager.getInstance(this);

TestReceiver receiver = new TestReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction(ACTION_TEST_RECEIVER);

//注册广播
mManager.registerReceiver(localReceiver, filter );

//取消注册
mManager.unregisterReceiver(localReceiver);

//发送广播
Intent intent =new Intent();
intent.setAction(ACTION_TEST_RECEIVER);
//传递数据
intent.putExtra("name","数据");
mManager.sendBroadcast(intent);

BroadCastReceiver的生命周期

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

注意问题

1.一个广播使用了静态注册和动态注册,则会注册两次广播接收者。
2.当发送广播被不想被除应用第三方接收时,应该给broadcast发送方设置permission权限。
3.当自己广播接收器需要过滤特定广播来源时,需要给广播接收器设置intent-filter指定接收广播的类型。
4.onReceive()方法运行在主线程,不能做耗时的操作,否则会导致主线程阻塞,需要处理耗时操作时可以通过启动一个service进行处理。
5.使用动态注册的方式,退出销毁activity时,要取消注册广播
6.当接收到广播时,会重新创建BroadcastReceiver对象,回调onReceive()函数,之后BroadcastReceiver对象将被销毁。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值