BroadCast(广播)
-
标准广播 完全异步广播,所有广播接收器同时接收
-
有序广播 同步广播,优先级高的先接受,前面的广播可以截断
广播接收器注册方式:
动态:
-
创建一个广播接收器类,继承BroadCastReceiver类,有广播到来时,onReceive()方法就会得到执行。需要注意的是,动态注册的广播接收器一定都要取消注册才行,可以在onDestroy()方法中调用unregisterReceiver()方法来实现。
-
缺点:必须启动后才可以接收广播
intentFilter = new IntentFilter(); intentFilter.addAction("com.gww.broadcast"); dBroadCastReceiver = new DBroadCastReceiver(); registerReceiver(dBroadCastReceiver,intentFilter);
静态:
<receiver android:name=".JBroadcastReceiver" android:enabled="true" android:exported="true"> <intent-filter> <action android:name="com.gww.broadcast"/> </intent-filter> </receiver>
静态的广播接收器一定要在AndroidManifest.xml文件中注册才可以使用。
静态广播发送不成功可能原因:原因在于这个广播 是“隐式” 发送的,8.0中,静态注册的广播接收者无法接受 隐式 广播。
-
可以显示发送
Intent intent = new Intent(MainActivity.this,JBroadcastReceiver.class);
sendBroadcast(intent);
有序广播:
IntentFilter filter2 = new IntentFilter();
filter2.addAction("com.gww.you1");
filter2.setPriority(1001);
this.registerReceiver(new text2Receiver(), filter2);
IntentFilter filter1 = new IntentFilter();
filter1.addAction("com.gww.you1");
filter1.setPriority(1000);
this.registerReceiver(new text1Receiver(), filter1);
IntentFilter filter3 = new IntentFilter();
filter3.addAction("com.gww.you1");
filter3.setPriority(998);
this.registerReceiver(new text3Receiver(), filter3);
sendOrderedBroadcast(intent,null); 使用 abortBroadcast();可以截断广播
sendBroadcast(intent);也可发送有序广播,但是无法截断
不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为再广播接收器中是不允许开启线程的
动态广播最好在Activity 的onResume()注册、onPause()注销。原因:对于动态广播,有注册就必然得有注销,否则会导致内存泄露