安卓开发学习笔记—————《第一行代码》第五章 广播机制
Android中的广播分为:标准广播(所有广播接收器几乎会在同一时刻接收到这条广播消息)和有序广播(同一时刻只有一个广播接收器能够收到这条广播消息。
广播接收器动态注册广播,如监听网络变化:
public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceiver networkChangeReceiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); } class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "network changes", Toast.LENGTH_SHORT).show(); } } }
静态注册
包——New——Other——Broadcast Receiver,然后在AndroidManifest.xml进行修改
<receiver ...> <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> <intent-filter> </receiver>
注:Android8.0在AndroidManifest.xml文件中静态注册广播接收失效,官方对耗电量的优化,避免APP滥用广播。除了少部分的广播仍支持静态注册(如开机广播),其余的都会出现失效的情况。可通过APP的Activity中对广播接收进行动态注册。
发送标准广播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCASAT"); sendBroadcast(intent);
发送有序广播
sendBroadcast改成 sendOrderBroadcast(intent,null);
然后修改在AndroidManifest.xml中的intent-filter。
<intent-filter android:priority="100"> <action android:name="MyBroadcastReceiver"/> </intent-filter>
使用abortBroadcast()截止广播
使用本地广播
主要使用了一个LocalBroadcastManager来对广播进行管理,并提供了发送广播和注册接收器的方法。
mLocalBroadcastManager = LocalBroadcastManager.getInstance(this); mLocalBroadcastManager.sendBroadcast(intent); mLocalBroadcastManager.registerReceiver(mLocalReceiver,mIntentFilter)
广播实践——强制下线功能
项目名:BroadcastBestPractice