1、Android广播分类
android的广播类型分为两类:标准广播和有序广播。
标准广播:异步广播,广播发出后,所有注册了的广播接收器都会同时接收到该广播。打个比方:做地铁过程中的语音播报,当列车员(广播发出者)进行语音播报(发送广播)时,所有乘客(注册接收该广播的程序)都可以同时听到语音,不分先后顺序。 在android系统中存在此类的广播有启动完成、电量变化等;
有序广播:同步发送,广播发出后,按照注册了的广播接收器的优先级顺序广播,优先级的范围是-1000~1000,数字越大,优先级越高,最先接收到该广播,接收器的优先级通过android:priority设置。打个比方:在接力赛中,接力棒就是广播的内容,需要运动员依次传递,优先级高的运动员位置靠前,优先级的运动员位置靠前,运动员接力的过程就是广播的过程。当然,要是有个运动员觉得:哎,这个接力棒当门栓不错,兜里一装回家了,后面的运动员自然不能接收到这个广播了。android系统中的短信就是以这种形式进行广播,我们手机上安装的XX卫士,XX安全大师的短信拦截功能就是把自身接收短信的优先级高于系统的短信应用,达到拦截短信的目的。
2、接收广播(BroadcatReceiver)
接收广播前需要注册自身关心那些广播,注册方式有两种,动态注册和静态注册。
2.1 动态注册
动态检测即当程序开始运行后进行注册接收,在程序未启动的状态在,不接受此广播,
下面以检测网络状态为例,实现其核心代码
1、实现广播接收器
/*所有广播接收器都需要继承BroadcastReceiver*/ class NetworkChangeReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { /*do something*/ } }
2、注册广播接收器
public class MainActivity extends Activity {
…
private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); /*设置监听网络状态变化的广播*/ intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); /*注册该广播*/ registerReceiver(networkChangeReceiver, intentFilter); }
…
}
3、在AndroidMainfest.xml中声明申请获取网络状态权限
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcasttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> /*声明申请获取网络状态权限*/ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> ... </manifest>
4、注销广播接收器
public class MainActivity extends Activity { … @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); } … }
2.2 静态注册
静态注册是指在程序未运行的情况下同样可以接收该广播,从而启动程序。
1、实现广播接收器(需要单独建文件实现)
/*所有广播接收器都需要继承BroadcastReceiver*/ class NetworkChangeReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { /*do something*/ } }
2、在AndroidMainfest.xml中声明申请获取网络状态权限和声明广播接收器
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.broadcasttest" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" android:targetSdkVersion="19" /> /*声明申请获取网络状态权限*/ <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> ... <application> ... /*声明广播接收器*/ <receiver android:name=".NetworkChangeReceiver"> <intent-filter android:priorit="1000"> <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> </intent-filter> </receiver> ... </application> </manifest>
3、发送广播(sendBroadcast)
3.1 发送标准广播
发送标准广播代码
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); intent.putExtra(“XLZH”, “this is a user-defined broadcast!”)
sendBroadcast(intent);
com.example.broadcast.MY_BROADCAST是自定义的广播,如要有其他应用程序需要监听该广播,则需要进行动态或者静态注册
3.1 发送有序广播
发送有序广播代码
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST"); intent.putExtra(“XLZH”, “this is a user-defined broadcast!”)
sendOrderedBroadcast(intent);
4、本地广播(LocalBroadcast)
如果广播有带有用户的敏感消息,不想让其他应用程序监听,此时可以使用本地广播,仅在应用程序内部进行广播和接收操作
1、实现广播接收器
/*所有广播接收器都需要继承BroadcastReceiver*/ class LocalBroadcastReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { /*do something*/ } }
2、注册广播接收器
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST"); LocalBroadcastReceiver localReceiver = new LocalBroadcastReceiver(); localBroadcastManager.registerReceiver(localReceiver, intentFilter);
3、发送本地广播
LocalBroadcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this); Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST"); intent.putExtra("XLZH", "This is a localBroadcast!"); localBroadcastManager.sendBroadcast(intent);
com.example.broadcasttest.LOCAL_BROADCAST是自定义的本地广播,与标准广播不同的是需要调用LoaclBroadcastManager的Instance()方法获得实例,发送自定义的注册广播接收器的时候分别使用的LocalBroadcastManager的sendBroadcast()方法和registerReceiver()方法
另外本地广播只能动态注册,不能静态注册