• 广播


    广播

    广播机制

    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);





  • 相关阅读:
    Python面向对象:继承和多态
    Python面向对象:类、实例与访问限制
    Python正则表达式匹配猫眼电影HTML信息
    Git:从github上克隆、修改和更新项目
    Python:闭包
    JPA-映射-(@ManyToMany)双向多对多
    rownum详解
    java之yield(),sleep(),wait()区别详解
    springmvc<一>一种资源返回多种形式【ContentNegotiatingViewResolver】
    @RequestParam,@PathVariable,@ResponseBody,@RequestBody,@ModelAttribute学习
  • 原文地址:https://www.cnblogs.com/qianzi067/p/6015543.html
Copyright © 2020-2023  润新知