广播

广播

广播机制

  1. 标准广播
    一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都在同一时刻接收到这条广播消息。它们之间没有先后顺序。因此,广播不可截断。

  2. 有序广播
    一种同步执行的广播,广播发出后,同一时刻只会有一个广播接收器能接收到这条广播消息(有优先级的)。因此,广播可以被截断。

接受系统广播

系统内置许多广播,比如电池电量变化,时间时区变化,开机等等。
广播接收器有静态(AndroidManifest.xml中注册)和动态(代码中注册)两种注册方式。

  1. 动态注册
  1. protectedvoid onCreate(Bundle savedInstanceState){
  2. super.onCreate(savedInstanceState);
  3. setContentView(R.layout.activity_main);
  4. IntentFilter intentFilter =newIntentFilter();
  5. intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
  6. networkChangeReceiver =newNetworkChangeReceiver();
  7. registerReceiver(networkChangeReceiver, intentFilter);
  8. }

NetworkChangeReceiver是继承自BroadcastReceiver类的内部类。接受逻辑在onReceive方法中覆写。

  1. 静态注册
    首先,新建一个继承自BroadcastReceiver的类BootCompleteReceiver。
    然后,在AndroidManifest.xml中进行配置
  1. <manifestxmlns:android="http://schemas.android.com/apk/res/android"
  2. package="com.example.broadcasttest"
  3. android:versionCode="1"
  4. android:versionName="1.0">
  5. ……
  6. <uses-permissionandroid:name="android.permission.ACCESS_NETWORK_STATE"/>
  7. <uses-permissionandroid:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
  8. <application>
  9. android:allowBackup="true"
  10. android:icon="@drawable/ic_launcher"
  11. android:label="@string/app_name"
  12. android:theme="@style/AppTheme" >
  13. ……
  14. <receiverandroid:name=".BootCompleteReceiver">
  15. <intent-filter>
  16. <actionandroid:name="android.intent.action.BOOT_COMPLETED"/>
  17. </intent-filter>
  18. </receiver>
  19. </application>
  20. </manifest>

所有静态的广播接收器都在<receiver>标签中注册。注意<uses-permission>标签指定了应用的权限。

  1. 两种方式优缺点
注册方式优点缺点
动态注册 灵活,自由地控制注册和注销 必须在程序启动之后才能接收到广播
静态注册 未启动就可收到广播 不够灵活

发送自定义广播

  1. 发送标准广播
  1. Intent intent =newIntent("com.example.broadcast.MY_BROADCAST");
  2. sendBroadcast(intent);
  1. 发送有序广播
    只需将sendBroadcast函数替换为sendOrderedBroadcast函数即可。
  1. Intent intent =newIntent("com.example.broadcasttest.MY_BROADCAST");
  2. sendOrderedBroadcast(intent,null);

第二个参数是一个与权限相关的字符串。
广播接收器的顺序需要在AndroidManifest.xml文件中定义

  1. <receiverandroid:name=".MyBroadcastReceiver">
  2. <intent-filterandroid:priority="100">
  3. <actionandroid:name="com.example.broadcasttested.MyBROADCAST"/>
  4. </intent-filter>
  5. </receiver>

优先级高的广播接收器会先执行。
在接收器中可以选择是否截断广播
在接收器中调用abortBroadcast();

本地广播

使用LocalBroadcastManager来对广播进行管理,提供发送广播和注册广播接收器的方法。

  1. localBroadcastManager =LocalBroadcastManager.getInstance(this);//获得实例
  2. localBroadcastManager.sendBroadcast(intent);//发送本地广播
  3. localBroadcastManager.registerReceiver(localReceiver, intentFilter);//注册
  4. localBroadcastManager.unregisterReceiver(localReceiver);





posted @ 2016-10-31 13:20  qianzi  阅读(267)  评论(0编辑  收藏  举报