Android广播和服务机制
目录
一、广播概述
一、概述
广播(Broadcast)机制用于进程/线程间通信,其中广播接收者BroadcastReceiver便是Android四大组件之一。因此在我们应用程序内发出的广播,其他的应用程序应该也是可以收到的。广播分为广播发送和广播接收两个过程。
发送广播的方法是使用Intent,而接收广播使用的是广播接收者(Broadcast Receiver)
BroadcastReceiver分为两类:
静态广播接收者:通过AndroidManifest.xml的标签来申明的BroadcastReceiver。
动态广播接收者:通过AMS.registerReceiver()方式注册的BroadcastReceiver,动态注册更为灵活,可在不需要时通过unregisterReceiver()取消注册。
从广播发送方式可分为二类:
标准广播(Normal broadcasts):通过Context.sendBroadcast()发送,是一种完全异步执行的广播
有序广播(Ordered broadcasts):通过Context.sendOrderedBroadcast()发送,是一种同步执行的广播
广播的功能和特征:
1、广播的生命周期很短,经过 调用对象—实现onReceive—结束 整个过程就结束了。从实现的复杂度和代码量来看,广播无疑是最迷你的Android 组件,实现往往只需几行代码。广播对象被构造出来后通常只执行BroadcastReceiver.onReceive方法,便结束了其生命周期。所以有的时候我们可以把它当做函数看也未必不可。
2、和所有组件一样,广播对象也是在应用进程的主线程中被构造,所以广播对象的执行必须是要同步且快速的。也不推荐在里面开子线程,因为往往线程还未结束,广播对象就已经执行完毕被系统销毁。如果需要完成一项比较耗时的工作 , 应该通过发送 Intent 给 Service, 由 Service 来完成。
3、每次广播到来时 , 会重新创建 BroadcastReceiver 对象 , 并且调用 onReceive() 方法 , 执行完以后 , 该对象即被销毁 . 当 onReceive() 方法在 10 秒内没有执行完毕, Android 会认为该程序无响应。
应用场景
- 同一应用具有多个进程的不同组件之间的消息通信
- 不同应用间的组件之间的消息通信
- 与Android系统在特定情况下的通信
如:系统开机,网络变化等
二、接收广播之注册广播
注册广播有两种方式:动态注册和静态注册
1、非常驻型广播(动态注册):非常驻型广播,广播跟随程序的生命周期,当应用程序结束了,广播自然就没有了,比如在 Activity 中的 onCreate 或者 onResume 中注册广播接收者,在 onDestory 中注销广播接收者。这样你的广播接收者就一个非常驻型的了,这种注册方式也叫动态注册。这种方式可以理解为通过代码注册的广播是和注册者关联在一起的。动态注册的广播,最后必须取消注册。这类广播,只有应用启动了,才能接收到广播。
实现动态注册需要以下内容
- 一个广播接收器类 —— 实质就是一个继承自BoradCastReceiver的类,只要继承这个类,就有具体接收广播的能力了。
- 重写父类的onReceive()方法 —— 接收到广播的时候,就会回调这个方法。因此,广播接收
器的处理逻辑就写在这里。 - 一个 IntentFilter 对象,广播接收器接收什么样的广播,由它的addAction()方法决定。
- 在代码中注册广播接收器,通过registerReceiver方法。方法接受两个参数,一个是广播接收
器实例,一个是IntentFilter实例。
取消注册广播 ,通过unregisterReceiver() 方法—— 在哪里取消注册无所谓,只要保证取
消注册就OK。 - 如果需要权限,则在AndroidManifest.xml文件申明权限
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.Toast;
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
//网络发生变化时系统发出的是一条值为android.net.conn.CONNECTIVITY_CHANGE的广播,
//即想监听什么广播就在此添加相应action
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
//创建NetworkChangeReceiver实例
networkChangeReceiver = new NetworkChangeReceiver();
//注册实例
registerReceiver(networkChangeReceiver, intentFilter);
}
@O