一、普通广播:
1.普通广播是一种完全异步的广播,通过context的sendBroadcast方式进行发送,消息发送的速度很快,但是消息是无序的。
在没有一个匹配的广播接收者接到之前,没办法停止intent的传递。
2.使用方式:继承BrocastReceiver
public class BootReceiver extends BroadcastReceiver {
private final static String TAG = "BootReceiver";
@Override
public void onReceive(Context context, Intent intent) {
L.d(TAG, intent.getAction());
if (intent.getAction().equals(Intent.ACTION_BOOT_COMPLETED)) {
context.startService(new Intent(context, SocketService.class));
context.startService(new Intent(context, VideoService.class));
}
}
}
注册广播:有两种方式 静态注册----在清单文件中注册:
<receiver android:name="com.efrobot.control.receivers.BootReceiver">
<intent-filter>
<!-- 系统启动广播 -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
</receiver>
在代码块进行注册:
private void registerBrocastReceiver(){
IntentFilter filter = new IntentFilter();
filter.addAction(NOTIFY_VIDEO_CONTROL_FRAGMENT);
getContext().registerReceiver(mControlBrocast, filter);
}
记得在onDestory中进行解绑
监听系统网络状态的广播
/**
* 网络变化
*/
private final static String CONNECTIVITY_ACTION =ConnectivityManager.CONNECTIVITY_ACTION;
//注册广播监听
IntentFilter mFilter = new IntentFilter();
mFilter.addAction(CONNECTIVITY_ACTION);
getContext().registerReceiver(myBroadcastReceiver, mFilter);
private BroadcastReceiver myBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
L.d(TAG, intent.getAction());
String intentAction = intent.getAction();
if (intentAction.equals(CONNECTIVITY_ACTION)) {
if(!NetUtils.hasNetwork(getContext())){
onDisconnect(-1000, null);
L.e(TAG,"no Net,onDisconnect(-1000, null);");
}
}
}
};
二、有序广播:
有序广播通过sendOrderedBroadcast来发送,广播接收器接收的消息按照优先级依次执行。针对广播接收者监听的每一个行为的优先级可以在清单文件注册广播时,同时添加监听行为的优先级--->intent-filter中的android:priority属性进行设置。数值越大优先级越高。
例:对test行为处理的优先级是100。
<receiver android:name="com.efrobot.control.receivers.BootReceiver">
<intent-filter>
<!-- 系统启动广播 -->
<action android:name="android.intent.action.BOOT_COMPLETED"/>
</intent-filter>
<intent-filter android:priority="100"> //数值越大优先级越高
<!-- 系统启动广播 -->
<action android:name="com.orange.test"/>
</intent-filter>
</receiver>
在广播接收者接收到广播后,可以使用setResult()方法把处理的结果发送给下一个广播,下一个广播通过getResult()拿到上一个广播发送的结果。并可以使用abortBroadcast函数来让系统丢弃该广播,使当前行为的广播不在传递。
例子来源于:http://blog.csdn.net/superjunjin/article/details/7487187
注册两个广播2,接收到广播处理后,把结果传递给广播1
<application
android:icon="@drawable/ic_launcher"
android:label="@string/app_name" >
<activity
android:label="@string/app_name"
android:name=".C48_BroadcastActivity" >
<intent-filter >
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
<!--优先级的设定 MyReceiver2大于MyReceiver1,优先级的范围-1000~1000 -->
</activity>
<receiver android:name=".MyReceiver1">
<intent-filter android:priority="200">
<action android:name="com.song.123"/>
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="1000">
<action android:name="com.song.123"/>
</intent-filter>
</receiver>
</application>
public class BroadcastActivity extends Activity {
/** Called when the activity is first created. */
Button button;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
button=(Button)findViewById(R.id.button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Intent intent=new Intent("com.song.123");
Bundle bundle=new Bundle();
bundle.putString("a", "aaa");
intent.putExtras(bundle);
//发送一个有序的广播
sendOrderedBroadcast(intent, null);
}
});
}
}
广播2因为优先级大 先接收这个广播
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
if(intent.getAction.equals("com.song.123")){
System.out.println("receiver2");
// context.getSystemService(name);
Bundle bundle=intent.getExtras();
bundle.putString("b", "bbb");
System.out.println("a="+bundle.get("a"));
setResultExtras(bundle);
//切断广播
// abortBroadcast(); //切断后,处理的结果将不会传递给下一个广播--->广播1
}
}
}
广播1如果不添加getResultExtras(true)方法,将不接收广播2处理的结果。
public class MyReceiver1 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
// TODO Auto-generated method stub
System.out.println("receiver1");
//要不要接受上一个广播接收器receiver2传来的的数据
Bundle bundle=getResultExtras(true);
System.out.println("a="+bundle.getString("a")+",b="+bundle.getString("b"));
}
}
三、本地广播
本地广播实在21的版本的Support v4新增加的本地广播:LocalBroadcastManager。上述的两个都是全局的,所有应用都可以接收到,这样会造成安全隐患,有时候我们不需要把广播发送给所有的应用,所以本地广播提供了这个支持。使用的方式也很简单。把普通广播的发送方式改为:LocalBroadcastManager.getInstance(context)中对应的发送,解绑,注册方法就行了。
.......
private Context mContext;
private IntentFilter mIntentFilter;
private LocalBroadcastManager mLocalBroadcastManager;
private LocalBroadcastReceiver mLocalBroadcastReceiver;
.......
/**
* 注册本地广播接收者
*/
private void registerLocalBroadcastReceiver(){
mIntentFilter=new IntentFilter(test_action);
mLocalBroadcastReceiver=new LocalBroadcastReceiver();
mLocalBroadcastManager=LocalBroadcastManager.getInstance(mContext);
mLocalBroadcastManager.registerReceiver(mLocalBroadcastReceiver, mIntentFilter);
}
/**
* 发送本地广播
*/
private void sendLocalBroadcast(){
mIntent=new Intent(test_action);
mIntent.putExtra(number, 9527);
mLocalBroadcastManager.sendBroadcast(mIntent);
//发送广播后取消本地广播的注册
unRegisterLocalBroadcastReceiver();
}
/**
* 取消本地广播的注册
*/
private void unRegisterLocalBroadcastReceiver(){
if (mLocalBroadcastManager!=null) {
if (mLocalBroadcastReceiver!=null) {
mLocalBroadcastManager.unregisterReceiver(mLocalBroadcastReceiver);
}
}
}
四、Sticky广播。
1.Sticky广播是会滞留的广播,通过context.sendStickyBroadcast()方法进行发送,用此方法发送的广播会滞留一段时间,知道有对应的广播接收者注册时,该广播接收者就会收到该广播。
2.需要用到
android.permission.BROADCAST_STICKY 权限
sendStickyBroadcast只会保留最后一条广播,并且一直保存下去,这样即使有了广播接收者接收到了广播,当再有广播接收者被注册时仍然会接收到该广播。如果只想处理一遍该广播可以使用removeStickyBroadcast来处理。