分类 标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出后,所有的广播接收器都在同一时刻受到这条广播消息,没有先后顺序。效率高,无法被截断。
有序广播(Ordered broadcasts)是一种同步执行的广播,同一时刻,只有一个广播接收器能受到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。 有先后顺序,优先级高的会先收到广播消息,并且前面的广播接收器可以截断正在传递的广播。
接受广播:广播接收器(Broadcast Receiver)
系统广播 注册广播 动态注册的广播接收器一定要取消注册,一般是在onDestroy()方法中通过调用unregisterReceiver()方法来实现的。
动态注册 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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 public class MainActivity extends AppCompatActivity { private IntentFilter mIntentFilter; private static boolean wifiConnected = false ; private static boolean mobileConnected = false ; private TextView mWifiTextView; private TextView mMobileTextView; private NetworkChangeReceiver mNetworkChangeReceiver; @Override protected void onCreate (Bundle savedInstanceState) { super .onCreate(savedInstanceState); setContentView(R.layout.activity_main); mWifiTextView=(TextView)findViewById(R.id.wifi); mMobileTextView=(TextView)findViewById(R.id.mobile_network); mIntentFilter=new IntentFilter(); mIntentFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); mNetworkChangeReceiver=new NetworkChangeReceiver(); registerReceiver(mNetworkChangeReceiver,mIntentFilter); } @Override protected void onDestroy () { super .onDestroy(); unregisterReceiver(mNetworkChangeReceiver); } class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive (Context context, Intent intent) { ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo activeInfo = connMgr.getActiveNetworkInfo(); if (activeInfo != null && activeInfo.isConnected()) { wifiConnected = activeInfo.getType() == ConnectivityManager.TYPE_WIFI; mobileConnected = activeInfo.getType() == ConnectivityManager.TYPE_MOBILE; if (wifiConnected) { mWifiTextView.setText("Wifi is connected" ); mMobileTextView.setText("mobile network is not connected" ); } else if (mobileConnected) { mWifiTextView.setText("Wifi is not connected" ); mMobileTextView.setText("mobile network is connected" ); } } else { mWifiTextView.setText("Wifi is not connected" ); mMobileTextView.setText("mobile network is not connected" ); } } } }
另外还需在增加以下两个权限,否则会在打开的时候崩溃。
1 2 <uses-permission android:name ="android.permission.INTERNET" /> <uses-permission android:name ="android.permission.ACCESS_NETWORK_STATE" />
效果
静态注册 1 2 3 4 5 6 7 public class BootCompleteReceiver extends BroadcastReceiver { @Override public void onReceive (Context context, Intent intent) { Toast.makeText(context,"Boot Complete" ,Toast.LENGTH_LONG).show(); } }
在AndroidManifest.xml中需要添加下列语句:
1 2 3 4 5 6 7 8 9 10 11 12 13 <user-permission android:name ="android.permission.RECEIVE_BOOT_COMPLETED" /> ...... <application ... > ..... <receiver android:name =".BootCompleteReceiver" > <intent-filter > <action android:name ="android.intent.action.BOOT_COMPLETED" /> </intent-filter > </receiver > </application >
自定义广播 写一个自定义的广播接收器
1 2 3 4 5 6 7 public class MyBroadcastReceiver extends BroadcastReceiver { @Override public void onReceive (Context context, Intent intent) { Toast.makeText(context,"received in MyBroadcastReceiver" , Toast.LENGTH_LONG).show(); } }
发出一个广播
1 2 Intent intent=new Intent("com.jc.broadcast_1.MY_BROADCAST" ); sendBroadcast(intent);
在一个应用程序中发出的广播,也是可以被其它应用程序所接收到的。
发送有序广播 1 sendOrderedBroadcast(Intent intent,String receiverPermission);
这样可以截断广播, 在onReceiver(...)方法里调用abortBroadcast()方法,就表示将这条广播截断。后面的广播就无法再接收到这条广播。
本地广播 只能在应用程序的内部进行传递,并且广播接收器也只能接受来自本应用发出的广播。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 mLocalBroadcastManager=LocalBroadcastManager.getInstance(this ); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick (View v) { Intent intent=new Intent("com.jc.broadcast_2.LOCAL_BROADCAST" ); mLocalBroadcastManager.sendBroadcast(intent); } }); mIntentFilter=new IntentFilter(); mIntentFilter.addAction("com.jc.broadcast_2.LOCAL_BROADCAST" ); mLocalReceiver=new LocalReceiver(); mLocalBroadcastManager.registerReceiver(mLocalReceiver,mIntentFilter);