[关闭]
@Allen-miss 2017-05-18T11:47:38.000000Z 字数 4713 阅读 709

全局大喇叭——详解广播机制

Broadcast



  1. public class MainActivity extends AppCompatActivity {
  2. private IntentFilter intentFilter;
  3. private NetworkChangeReceiver networkChangeReceiver;
  4. @Override
  5. protected void onCreate(Bundle savedInstanceState) {
  6. super.onCreate(savedInstanceState);
  7. setContentView(R.layout.activity_main);
  8. intentFilter = new IntentFilter();
  9. intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  10. networkChangeReceiver = new NetworkChangeReceiver();
  11. registerReceiver(networkChangeReceiver,intentFilter);
  12. }
  13. class NetworkChangeReceiver extends BroadcastReceiver{
  14. @Override
  15. public void onReceive(Context context, Intent intent) {
  16. ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
  17. NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
  18. if(networkInfo!=null&&networkInfo.isAvailable()){
  19. Toast.makeText(context,"网络可用",Toast.LENGTH_LONG).show();
  20. }else{
  21. Toast.makeText(context,"网络不可用",Toast.LENGTH_LONG).show();
  22. }
  23. }
  24. }
  25. //在onDestroy中注销广播
  26. @Override
  27. protected void onDestroy() {
  28. super.onDestroy();
  29. unregisterReceiver(networkChangeReceiver);
  30. }
  31. }
  1. AndroidMainifest.xml加入权限
  2. <uses-permission android:name="android.permission.access_network_state" />
  1. public class BootCompleteReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. Toast.makeText(context,"Boot Complete",Toast.LENGTH_LONG).show();
  5. }
  6. }

AndroidMainifest.xml加入权限

  1. <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  2. <receiver
  3. android:name=".BootCompleteReceiver"
  4. android:enabled="true"
  5. android:exported="true">
  6. <intent-filter>
  7. <action android:name="android.intent.action.BOOT_COMPLETED"/>
  8. </intent-filter>
  9. </receiver>

不要在onReceive中添加过多的逻辑或者进行任何耗时的操作,在广播接收器中不允许开线程,当onReceive()运行了较长的时间而没有结束时,程序就会报错。因此广播接受者跟多的扮演的是一种打开程序其他组件的角色,比如创建一条状态通知栏,或者启动一个服务等。

  1. //自定义一个广播
  2. public class MyBroadcastReceiver extends BroadcastReceiver {
  3. @Override
  4. public void onReceive(Context context, Intent intent) {
  5. Toast.makeText(context,"receiver in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
  6. }
  7. }
  1. //在清单文件注册action
  2. <receiver
  3. android:name=".MyBroadcastReceiver"
  4. android:enabled="true"
  5. android:exported="true">
  6. <intent-filter>
  7. <action android:name="com.example.seele.broadcasttest.MY_BROADCAST"/>
  8. </intent-filter>
  9. </receiver>
  1. //在activity发送广播
  2. TextView SendBroadCast = (TextView) findViewById(R.id.send_broadcast);
  3. SendBroadCast.setOnClickListener(new View.OnClickListener() {
  4. @Override
  5. public void onClick(View v) {
  6. Intent intent = new Intent("com.example.seele.broadcasttest.MY_BROADCAST");
  7. sendBroadcast(intent);
  8. }
  9. });

2.发送有序广播

  1. SendBroadCast.setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. Intent intent = new Intent("com.example.seele.broadcasttest.MY_BROADCAST");
  5. // sendBroadcast(intent);
  6. //发送有序广播第一个参数是Intent,第二个参数是与权限相关的字符串,这里传入的是null
  7. sendOrderedBroadcast(intent,null);
  8. }
  9. });

设置广播的优先级

  1. <receiver
  2. android:name=".MyBroadcastReceiver"
  3. android:enabled="true"
  4. android:exported="true">
  5. <!--设置广播的优先级android:priority="100"-->
  6. <intent-filter android:priority="100">
  7. <action android:name="com.example.seele.broadcasttest.MY_BROADCAST"/>
  8. </intent-filter>
  9. </receiver>

拦截广播

  1. public class MyBroadcastReceiver extends BroadcastReceiver {
  2. @Override
  3. public void onReceive(Context context, Intent intent) {
  4. Toast.makeText(context,"receiver in MyBroadcastReceiver",Toast.LENGTH_SHORT).show();
  5. //拦截广播
  6. abortBroadcast();
  7. }
  8. }

abortBroadcast();就是拦截广播的方法,拦截后别的广播就无法接收;

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注