广播机制
发送广播
Android中的广播主要分为两种类型——标准广播和有序广播
发出标准广播
标准广播发出后,所有广播接收器几乎会在同一时刻接受到这条广播信息,因此不可以被截断。
//action为广播名
Intent intent = new Intent("action");
Context.sendBroadcast(intent);
发送有序广播
有序广播发出后,根据优先级传递,同一时刻只会有一颗广播接收器能接收这条消息,前面的广播接收器可以截断广播,使后面的广播接收器无法收到广播消息。
//action为广播名
Intent intent = new Intent("action");
Context.setOrderedBroadcast(intent,null);
接收广播
接收广播需要新建一个类,并使他继承于BroadcastReceiver,并重写父类的onReceive()方法,当广播到来时会执行onReceive方法
public class MyReciever extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
........
}
}
//onReceive方法必须在10s内完成,否则程序就会报错
要接受广播,必须进行注册,注册分为静态注册和动态注册
静态注册:
在AndroidManifest.xml中注册
<mainifest ....
<application ....
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="action"/>
</intent-filter>
</receiver>
</application>
</manifest>
动态注册
1.动态注册在代码中注册
2.执行registerReceiver()方法后开始接收广播
3.动态注册必需要取消注册
public class MainActivity extends BaseActivity {
private IntentFilter intentFilter;
private MyReciever myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
intentFilter = new IntentFilter();
intentFilter.setAction("action");
myReceiver = new MyReceiver();
registerReceiver(myReceiver, intentFilter);
}
}
@Override
protected void onDestroy(){
super.onDestroy();
upRegisterReceiver(myReceiver);
}
动态注册和静态注册的区别:
动态注册只能在活动运行时接受广播,而静态注册是长驻在系统的
接受有序广播
权重的取值范围为-1000到1000
静态注册设置优先级
<mainifest ....
<application ....
<receiver android:name=".MyReceiver">
<intent-filter android:priority="100">
<action android:name="action"/>
</intent-filter>
</receiver>
</application>
</manifest>
动态注册设置优先级
intentFilter = new IntentFilter();
intentFilter.setPriority(100);
有序广播可在onReceive中传递数据给下一个广播接收器
public void onReceive(Context arg0, Intent intent) {
//获取上一个广播的bundle数据
Bundle bundle = getResultExtras(true);//true:前一个广播没有结果时创建新的Bundle;false:不创建Bundle
bundle.putString("key", "168168");
//将bundle数据放入广播中传给下一个广播接收者
setResultExtras(bundle);
//终止广播传给下一个广播接收者
abortBroadcast();
}
我们可以在前一个广播接收者将处理好的数据传送给后面的广播接收者,也可以调用abortBroadcast()来终结广播的传播。