码迷,mamicode.com
首页 > 其他好文 > 详细

Broadcast Server

时间:2018-09-12 13:13:33      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:最好   receive   子类   pause   onpause   pre   set   自动   事件   

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) {
        //执行操作
    }
}

 

Broadcast Server

标签:最好   receive   子类   pause   onpause   pre   set   自动   事件   

原文地址:https://www.cnblogs.com/conglingkaishi/p/9634104.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!