一、广播
广播是android中应用程序之间传输信息的机制。
BroadcastRecevier 广播接收者 是对发送出来的广播进行接收、过滤(通过action)、相应的一类组件。
二、广播的两种实现方式
1、静态注册广播
静态广播需要在AndroidManifest文件中注册,可以在程序未启动的情况下就能接收到广播
静态广播的使用
接收静态广播
(1)新建一个类继承自BroadcastRecevier
接收到广播时会,会回调onRecevier()方法
public class MyReceiver extends BroadcastReceiver { static final String ACTION = "com.songjialongs.MY_RECEVIER"; @Override public void onReceive(Context context, Intent intent) { //======通过action过滤广播 if (intent.getAction().equals(ACTION)) { Toast.makeText(context, "接收到静态广播", Toast.LENGTH_LONG).show(); //处理响应广播 } } }
(2)在AndroidManifest中注册相应的BroadcastRecevier<receiver android:name=".MyReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.songjialongs.MY_RECEVIER" /> </intent-filter> </receiver>
静态广播的发送
Intent intent = new Intent(MyReceiver.ACTION); //通过intent隐式调用,MyReceiver.ACTION是在上面新建的MyRecevier类定义的广播的action的字符串 sendBroadcast(intent);//发送广播
2、动态注册广播
动态广播可以自由的控制广播的注册与销毁,随着程序启动而创建,一般是在Activity的onResum()方法中注册,在onPause()方法中注销接收动态广播
(1)在Activity中实例化BroadcastRecevier并实现onRecevier()
static final String ACTION = "com.songjialongs.MY_DYNAMIC_RECEVIER"; BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(MainActivity.ACTION)) { Toast.makeText(context, "接收到动态广播", Toast.LENGTH_LONG).show(); //处理响应广播 } } };
(2)在Activity的onResum()中注册广播,onPause()中注销广播@Override protected void onResume() { IntentFilter intentFilter = new IntentFilter(MainActivity.ACTION); registerReceiver(mBroadcastReceiver, intentFilter); super.onResume(); }
@Override protected void onPause() { unregisterReceiver(mBroadcastReceiver); super.onPause(); }
动态广播的发送
Intent intent = new Intent(MainActivity.ACTION); sendBroadcast(intent);
三、广播的生命周期
BroadcastRecevier的生命周期只有10秒左右,接收到广播时候会回调onReceive(),执行完成后会销毁对象,如果在onRecevice()中执行耗时操作,会导致应用无响应。如果要在onReceive中执行耗时操作,应该通过Intent启动Service执行。
四、本地广播LocalBroadcast
一般广播实现的是程序之间的通讯,可以跨程序接收,而本地广播是通过Handler实现发送和接收处理广播,只能在本应用中接收到。
接收本地广播
(1)和一般广播类似,在Activity中实例化BroadcastRecevier并实现onRecevier()
BroadcastReceiver mBroadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals(MainActivity.ACTION)) { Toast.makeText(context, "接收到动态广播", Toast.LENGTH_LONG).show(); //处理响应广播 } else if (intent.getAction().equals(MainActivity.LOCAL_ACTION)) { Toast.makeText(context, "接收到本地广播", Toast.LENGTH_LONG).show(); } } };
(2)注册广播IntentFilter intentFilter1 = new IntentFilter(MainActivity.LOCAL_ACTION); //本地广播通过LocalBroadcastManager类实例注册本地广播 LocalBroadcastManager.getInstance(this).registerReceiver(mBroadcastReceiver, intentFilter1); super.onResume();
发送本地广播Intent intent = new Intent(MainActivity.LOCAL_ACTION); LocalBroadcastManager.getInstance(MainActivity.this).sendBroadcast(intent);