android 基础一 <Broadcast>
1.无序广播
//静态注册 <receiver android:name=".broadcast.MyReceiver1"> <intent-filter> <action android:name="com.broadcast.test1"/> </intent-filter> </receiver> //接收广播 public class MyReceiver1 extends BroadcastReceiver { String TAG="MyReceiver1"; @Override public void onReceive(Context context, Intent intent) { if("com.broadcast.test1".equals(intent.getAction())) { Log.e(TAG,"收到广播信息"); } } } //发送广播 public void send(View view){ Intent intent=new Intent(); intent.setAction("com.broadcast.test1"); sendBroadcast(intent); }
2.有序广播
//注册广播接收者 <receiver android:name=".broadcast.MyReceiver2" > <intent-filter android:priority="-1000"> <action android:name="com.broadcast.test2" /> </intent-filter> </receiver> <receiver android:name=".broadcast.MyReceiver3"> <intent-filter android:priority="1000"> <action android:name="com.broadcast.test2" /> </intent-filter> </receiver> // 广播接收者1: public class MyReceiver2 extends BroadcastReceiver { String TAG="MyReceiver2"; @Override public void onReceive(Context context, Intent intent) { if("com.broadcast.test2".equals(intent.getAction())) { Log.e(TAG,"收到有序广播信息 MyReceiver2 thread="+Thread.currentThread().getName()); } } } // 广播接收者2: public class MyReceiver3 extends BroadcastReceiver { String TAG="MyReceiver3"; @Override public void onReceive(Context context, Intent intent) { if("com.broadcast.test2".equals(intent.getAction())) { Log.e(TAG,"收到有序广播信息 MyReceiver3 thread= "+Thread.currentThread().getName()); //终止广播继续传递 abortBroadcast(); //改变结果数据 setResultData(); setResultExtras(); } } } // 发送广播 public void send(View view){ Intent intent=new Intent(); intent.setAction("com.broadcast.test2"); //该字符串指定接收者必须持有的权限,以便接收您的广播。如果为空,则不需要权限。 String receiverPermission=null; //您自己的BroadcastReceiver作为广播的最终接收器。 BroadcastReceiver resultReceiver=null; //用于调度resultReceiver回调;如果为空,则在上下文的主线程中调度 (这个参数可以设置将广播接收于后台线程回调) Handler scheduler=null; //结果代码的初始值。经常 Activity.RESULT_OK int initialCode= Activity.RESULT_OK; //initialData结果数据的初始值。经常null String initialData=null; //initialExtras是结果extras的初始值。经常null Bundle initialExtras=null; sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras); }
3.子线程接收resultReceiver
public void send(View view){ Intent intent=new Intent(); intent.setAction("com.broadcast.test2"); //该字符串指定接收者必须持有的权限,以便接收您的广播。如果为空,则不需要权限。 String receiverPermission=null; //您自己的BroadcastReceiver作为广播的最终接收器。 FinalReceiver resultReceiver=null; //用于调度resultReceiver回调;如果为空,则在上下文的主线程中调度 (这个参数可以设置将resultReceiver参数的广播接收于后台线程回调) Handler scheduler=null; //结果代码的初始值。经常 Activity.RESULT_OK int initialCode= Activity.RESULT_OK; //initialData结果数据的初始值。经常null String initialData=null; //initialExtras是结果extras的初始值。经常null Bundle initialExtras=null; //---------------------------- HandlerThread mThread = new HandlerThread("myThread"); mThread.start(); scheduler = new Handler(mThread.getLooper()); resultReceiver=new FinalReceiver(); //----------------------------- sendOrderedBroadcast(intent,receiverPermission,resultReceiver,scheduler,initialCode,initialData,initialExtras); }
4.无序广播的部分API介绍:
<1>改变传递的数据:
setResultData();
setResultExtras();
<2>终止广播传递
abortBroadcast();
有序广播和无序广播的区别:
1.有序广播可以改变结果,然后发送给下一个接收者。 无序广播不可以改变结果
2.有序广播可以中断广播传递。无序广播不可以中断
3.有序广播,效率没有无序广播高。
4.有序广播还可以使用子线程接收resultReceiver广播。
5.有序广播是根据intent-filter android:priority 参数的优先级一个个陆续传递。下一个接收者必须等待上一个接收者完成之后,才能继续接收。 无序广播会根据优先级连续发送出去,无需等待。