Android学习之路--四大组件--BroadCastReceiver

四大组件


      在开发中,我们经常会遇到这么一种情况,别处处理了一大堆事情,但是处理的结果要通知另一处的程序,另一处接受到这个处理结果在继续往下做一些事情。或者说我们要监听一些系统的一些状态,比如说网络的变化,电量的变化等等。这是我们就可以用安卓的四大组件之一————广播来完成我们需要的功能。

BroadCastReceiver—广播

      广播在用时需要在程序里进行注册,然后我们才能用。注册它有俩中方法,一种是静态注册,而是动态注册


  • 静态注册

          静态注册就是在manifest里写好了广播程序,在设置成程序开机xie的时候将广播开启,然后我们在广播的接受方法里接收广播信息即可。如:

1.自定义我们的广播,继承BroadCastReceiver

public class TestBroadCastReceive extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent!= null) {
            if("myAction".equals(intent.getAction())) {
                Log.i("info", intent.getStringExtra("data"));
            }
        }
    }
}

2.manifest配置

<receiver android:name=".TestBroadCastReceive">
     <intent-filter>
     <action android:name="android.intent.action.BOOT_COMPLETED"></action>
         <action android:name="myAction"></action>
     </intent-filter>
</receiver>

3.java程序发送广播

private void sendBroad(){
    Intent i = new Intent();
    i.setAction("myAction");
    i.putExtra("data","这是我发的信息");
    sendBroadcast(i);
}

在某处调用这个方法,我们在日志当中就可以看到我们发的信息。

.473 2667-2667/com.android.app I/info: 这是我发的信息

在这里我们看到要用的到的俩个配置属性,<action><intent-filter>,是过滤器中。在里面的<action>加的是我们要接受匹配的东西,不一样的我不管,我不接收。这个先了解即可,后面我们在详解。

静态广播注册后,就是和手机一起走了,手机光机了,它才停止,手机开启了,它就启动了。生命周期是一直存在的,一直处于候命状态。这样当我们就需要一些广播,处理完就没事了,不想在用了,如果用这种方式,耗费资源还不说还费电。那我们就可以用第二种动态广播来实现。静态是注册后不管,而动态则你可以随时管理我们的广播。废话不多说,进入主题。


  • 动态广播
          上面说了动态广播的好处,那我们直接贴代码。

1.广播还是那个广播,我们不动。

2.在程序启动后,注册

private void register() {
    broadcast = new TestBroadCastReceive();
    IntentFilter filter= new IntentFilter();
    filter.addAction("myAction");
    registerReceiver(broadcast,filter);
}

3.发送广播

private void sendBroad(){
    Intent i = new Intent();
    i.setAction("myAction");
    i.putExtra("data","这是我发的信息,动态的");
    sendBroadcast(i);
}

打印日志:

.902 12265-12265/com.android.app I/info: 这是我发的信息,动态的

动态的广播注册后,当我们退出当前注册页面时候,记得要取消广播,
unregisterReceiver(broadcast);否则会报错:

android.app.IntentReceiverLeaked: Activity com.android.app.TestActivity has leaked IntentReceiver com.android.app.TestBroadCastReceive@a181781 that was originally registered here. Are you missing a call to unregisterReceiver()?                                                           

虽说不会影响我们的程序,但是会造成内存溢出情况。


当我们在注册广播是我们可以设置一个级别,

IntentFilter filter= new IntentFilter();
filter.addAction("myAction");
filter.setPriority(int);

设置级别越高,那么它先去执行,级别越低,越最后执行,用这种做一些系统拦截了等等,级别相同,看系统心情喽。


      以上我们介绍的都是普通的广播,普通的广播执行,都是无序的,你不设置优先级,都是系统随意的滴用,也无法使用一些setResult的一些回调API。如果要用到这些东西,那就需要有序广播和无序广播了。有序广播就是执行,Context.sendOrderedBroadcast,它去执行后,receiver都是有序的去执行,你可以用abortBroadcast来中止发送广播,不往下传。也可以用setResult去做一些回调。

      广播的生命周期,简单来说就是创建,接收消息,销毁这几部。但是在这里处理任务时都不能超过11s。否则就是ANR了。这点大家注意一下。

好了,广播我们先介绍到这里,接下来。我们在介绍一位重量级组件,Service,拭目以待。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值