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