• Broadcast Server


    1.简介

      Broadcast Server  即广播,属于Android四大组件之一

      Android 广播分为两个角色:广播发送者,广播接收者

      主要用于:监听和接收其他应用APP或者Android系统发出的广播消息,并作出响应

    2.应用的场景

      Android不同组件的通信

      多线程之间的通信

      与Android系统在特定的情况下的通信 如电话呼入,电池状态的改变等

    3.实现模型

      Android的广播使用设计模式中的观察者模式:给予消息的发布/定于事件模型

      将Android广播的发送者和接收者解耦,使得系统方便集成,更易扩展

    4.广播接收器注册

      注册分为两种方式:静态注册和动态注册

    静态注册:

    在AndroidManifest.xml里通过<receive>标签声明  当app启动时,系统会自动实例化AndroidManifest

    中注册的类,并将其注册到系统中

    属性说明:

    <receiver 
        android:enabled=["true" | "false"]
    //此broadcastReceiver能否接收其他App的发出的广播
    //默认值是由receiver中有无intent-filter决定的:如果有intent-filter,默认值为true,否则为false
        android:exported=["true" | "false"]
        android:icon="drawable resource"
        android:label="string resource"
    //继承BroadcastReceiver子类的类名
        android:name=".mBroadcastReceiver"
    //具有相应权限的广播发送者发送的广播才能被此BroadcastReceiver所接收;
        android:permission="string"
    //BroadcastReceiver运行所处的进程
    //默认为app的进程,可以指定独立的进程
    //注:Android四大基本组件都可以通过此属性指定自己的独立进程
        android:process="string" >
    
    //用于指定此广播接收器将接收的广播类型
    //本示例中给出的是用于接收网络状态改变时发出的广播
     <intent-filter>
    <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
        </intent-filter>
    </receiver>

    电池广播注册示例:

            <receiver android:name=".BattarBroadcast">
                <intent-filter>
                    <action android:name="android.intent.action.BATTERY_CHANGED" />
                </intent-filter>
            </receiver>

    动态注册

      在Java代码中进行注册:调用Context.registerReceiver()方法

    // 选择在Activity生命周期方法中的onResume()中注册
    @Override
      protected void onResume(){
          super.onResume();
    
        // 1. 实例化BroadcastReceiver子类 &  IntentFilter
         mBroadcastReceiver mBroadcastReceiver = new mBroadcastReceiver();
         IntentFilter intentFilter = new IntentFilter();
    
        // 2. 设置接收广播的类型
        intentFilter.addAction(android.net.conn.CONNECTIVITY_CHANGE);
    
        // 3. 动态注册:调用Context的registerReceiver()方法
         registerReceiver(mBroadcastReceiver, intentFilter);
     }
    
    
    // 注册广播后,要在相应位置记得销毁广播
    // 即在onPause() 中unregisterReceiver(mBroadcastReceiver)
    // 当此Activity实例化时,会动态将MyBroadcastReceiver注册到系统中
    // 当此Activity销毁时,动态注册的MyBroadcastReceiver将不再接收到相应的广播。
     @Override
     protected void onPause() {
         super.onPause();
          //销毁在onResume()方法中的广播
         unregisterReceiver(mBroadcastReceiver);
         }
    }

    注意:动态注册的广播需要销毁,否则会导致内存泄漏

      也不允许重复注册和重复销毁

      动态广播最好在Activity 的 onResume()注册、onPause()注销

      在onResume()注册、onPause()注销是因为onPause()在App死亡前一定会被执行,从而保证广播在App死亡前一定会被注销,从而防止内存泄露。

    5.广播的发送者

      广播分为无序广播和有序广播

    发送无序广播:

            Intent intent = new Intent();
            //对应BroadcastReceiver中intentFilter的action
            intent.setAction("BROADCAST");
            //发送广播
            this.sendBroadcast(intent);

    发送有序广播

            Intent intent = new Intent();
            //对应BroadcastReceiver中intentFilter的action
            intent.setAction("BROADCAST");
            //发送广播
            this.sendOrderedBroadcast(intent,"receiverPermission");

    6.广播接收者

      创建类继承 BroadcastReceiver

      直接实例化BroadcastReceiver,重写  onReceive()方法.接收到广播后将自动调用改方法

      注意:默认情况下,广播接收器运行在 UI 线程,因此,onReceive()方法不能执行耗时操作,否则将导致ANR

    public class BattarBroadcast extends BroadcastReceiver {
        @Override
        public void onReceive(Context context, Intent intent) {
            //执行操作
        }
    }
  • 相关阅读:
    PowerShell笔记
    Windows难民安装docker的注意事项
    minix3使用轻快入门
    gentoo(贱兔) Linux作业系统的基本使用
    Artix Linux作业系统的使用~
    CentOS7搭建sftp
    Hello Wolrd
    Android开发技术周报 Issue#1
    Android开发技术周报 Issue#4
    Android开发技术周报 Issue#3
  • 原文地址:https://www.cnblogs.com/conglingkaishi/p/9634104.html
Copyright © 2020-2023  润新知