广播主要分为两种:标准广播和有序广播。
标准广播:异步执行的 广播,广播发出后所有的广播接收器都在同一时间接收到这条广播信息。。
有序广播:同步执行的广播,广播接收器具有优先级。同时可以截断广播。
接受系统广播
注册广播的方式也有有两种:在代码中注册和在AndroidMainFest.xml文件中注册。前者为动态注册后者为静态注册。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| public class MainActivity extends AppCompatActivity { private IntentFilter intentFilter; private NetworkChangeReceive networkChangeReceive;
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); //创建Intent实例 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");// 监听android.net.conn.CONNECTIVITY_CHANGE广播 networkChangeReceive = new NetworkChangeReceive(); registerReceiver(networkChangeReceive,intentFilter);// 注册广播 }
//动态注册的广播接收器一定要取消注册。 @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceive); }
class NetworkChangeReceive extends BroadcastReceiver{
@Override public void onReceive(Context context, Intent intent) { ConnectivityManager systemService = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = systemService.getActiveNetworkInfo(); // 注意在AndroidMainfest.xml文件中注册权限信息。 if (info != null && info.isAvailable()) { Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show(); }else { Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show();
} } } }
- 实例化自定义的广播接收器。
- 创建IntentFilter实例。
- 调用IntentFilter实例的addAction()方法添加监听的广播类型。
- 最后调用Context的registerReceiver(BroadcastReceiver,IntentFilter)动态的注册广播。
注册权限信息: <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
|
1
| <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
|
本地广播
全局广播很容易引起安全性问题,为了能够简单地解决广播的安全性问题,Android引入了一套本地广播机制,使用这个机制发出的广播只能在应用程序内部传递,并且广播接收器也只能接收来自本应用程序发出的广播。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| /*通过点击Button发送本地广播*/ public class BroadcastActivity extends AppCompatActivity {
private static final String TAG = "TAG";//标签 private LocalBroadcast localBroadcast; //本地广播 private Button mBtStart;//Button按钮
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_broadcast); mBtStart = findViewById(R.id.bt_start); mBtStart.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { LocalBroadcastManager.getInstance(BroadcastActivity.this).sendBroadcast(new Intent("com.hbbfxy.localbroadcast"));//发送本地广播 } }); /*注册广播*/ localBroadcast = new LocalBroadcast(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("com.hbbfxy.localbroadcast"); LocalBroadcastManager.getInstance(this).registerReceiver(localBroadcast, intentFilter);
}
private class LocalBroadcast extends BroadcastReceiver{
@Override public void onReceive(Context context, Intent intent) { Log.e(TAG, "onReceive: " ); } }
@Override protected void onDestroy() { super.onDestroy(); LocalBroadcastManager.getInstance(this).unregisterReceiver(localBroadcast);//接触注册广播 } }
|
注意在广播接收器中启动活动时需要给Intent添加FLAG_ACTIVITY_NEW_TASK标志。对话框中也需要添加TYPE_SYSTEM_ALERT否则可能会显示失败。