1、启动方式:有序,无序
无序广播:是一种完全异步执行的广播,在广播发出之后,所有的
广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
有序广播:是一种同步执行的广播,在广播发出之后,同一时刻
只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
2、发送广播
广播是使用 Intent 进行传递的,因此你还可以在 Intent 中携带一些数据传递给广播接收器。
//利用隐式Intent指定action,
Intent intent=new Intent(String action);
//可以传递数据到广播
//继承BroadCastReceiver里的onReceive()方法携带一个Intent
//自然可以利用这个Intent对象获取数据
//intent.putExtra()
//发送广播,action相同就会接收到
(1)、 发送无序广播
sendBroadcast(intent);
(2)、发送有序序广播
//多个广播接收器时,在intent-filter 中添加优先级
<intent-filter android:priority="100" >
//第二个参数是一个与权限相关的字符串,这里传入 null 就行了
sendOrderedBroadcast(intent,null);
3、申明方式:常驻,暂驻
常驻:静态注册广播接收器:
//1、创建一个类继承BroadcastReceiver
public class MyReceiver extends BroadcastReceiver {
public MyReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
}
}
//2、在AndroidManifest.xml 中将这个广播接收器的类名注册进去
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true" >
</receiver>
暂驻:动态注册广播接收器 :可以自由地控制注册与注销,在灵活性方面有很大的优势,但是
它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。
//1、在Activity定义一个类继承BroadCasrReceiver
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
}
}
//2、使用动态intentFilter给这个类设置属性
MyReceiver myreceiver=new MyReceiver();
IntentFilter intentFilter=new IntentFilter();
//添加一个action
intentFilter.addAction();
//设置优先级别
intentFilter.setPriority(-1000~1000);
//调用 registerReceiver()方法进行注册
registerReceiver(myreceiver,intentFilter);
PS:动态注册的广播接收器一定都要取消注册才行
调用unregisterReceiver(BroadcastReceiver receiver)
方法取消注册
4、广播之间传递信息
//BroadCastReceiver类中有这么两个方法
//源码
public final void setResultExtras(Bundle extras) {
checkSynchronousHint();
mPendingResult.mResultExtras = extras;
}
public final Bundle getResultExtras(boolean makeMap) {
if (mPendingResult == null) {
return null;
}
Bundle e = mPendingResult.mResultExtras;
if (!makeMap) return e;
if (e == null) mPendingResult.mResultExtras = e = new Bundle();
return e;
}
--存入信息--
//创建一个Bundle对象
Bundle bundle=new Bundle();
//传入一个字符串数据
bundle.putString("key","values")
//将这个对象传入
setResultExtras(bundle);
--取出信息--
getResultExtras(true).getString("key");
5、广播拦截
如果在 onReceive()方法中调用了 abortBroadcast()方法,就表示将这条广播截断,后面的广播接收器将无法再接收到这条广播
class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent)
{
//在这里获取action,判断你要拦截的action
//intent.getAction();
//拦截
abortBroadcast()
}
}