Android基础之初识Broadcast Receiver

来源:互联网 发布:办公楼网络改造方案 编辑:程序博客网 时间:2024/06/01 07:41

Android基础之初识Broadcast Receiver

Broadcast(广播)

    Android系统或应用程序会在产生某个事件时发送广播,比如网络状态改变、开机、电量改变和接收短信等。应用程序可以监听这些广播并做处理。

Broadcast Receiver是什么

    BroadcastReceiver(广播接收者)是Android四大组件之一,用来接收并响应来自系统和应用中的广播。通常一个广播可以被多个广播接收者所接收。

Broadcast Receiver的生命周期

    Broadcast Receiver的生命周期是从被调用开始,再到onReceiver方法执行完成之后结束。onReceiver方法必须在10秒内执行完成,否则Android系统会出现ANR(Application Not Responding)异常。所以不要在onReceiver方法中执行耗时的操作。如果需要在BroadcastReceiver中执行耗时的操作,可以通过Intent启动Service来完成,但不能绑定Service。

Broadcast的类型

①普通广播 (Normal broadcasts)
    所有监听该广播的广播接收者都可以监听到该广播,并且是没有先后顺序。异步广播使其可以同一时间被所有的接收者接收到。广播的传递效率比较高,不能停止传播。
②有序广播 (Ordered broadcasts)
    按照广播接收者的优先级顺序接收广播 , 优先级别在 intent-filter 中的 priority 中声明 ,优先级在-1000 到1000 之间 ,值越大优先级越高 。接收者可以拦截广播,即终止广播的继续传播 。优先级高的广播接收者可以在广播中放入信息,传递给下一个广播接收者。
③应用内广播(Local Broadcast)
     在本应用范围内传播的广播,不会造成隐私数据泄露,不会因为别的应用伪造广播而造成安全隐患。其相比在系统内发送全局广播,更高效。
④粘性广播(Sticky Broadcast)
    粘性广播在发送后,其Intent会一直保留到广播事件结束,这种广播也没有所谓的10秒耗时限制。发送粘性广播需要权限android.Manifest.permission.BROADCAST_STICKY。
⑤系统广播(System Broadcast)
    Android系统中内置了多种系统广播,每个广播都有特定的action,常用的系统广播对应的action如下:

系统广播 action 设备启动(仅广播一次) Intent.ACTION_BOOT_COMPLETED 重启设备 Intent.ACTION_REBOOT 充电时或电量发生变化 Intent.ACTION_BATTERY_CHANGED 电池电量低 Intent.ACTION_BATTERY_LOW 电池电量充满 Intent.ACTION_BATTERY_OKAY 屏幕锁屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS 屏幕被关闭 Intent.ACTION_SCREEN_OFF 屏幕被打开 Intent.ACTION_SCREEN_ON 关闭系统时 Intent.ACTION_SHUTDOWN 按下照相时的拍照按键(硬件按键)时 Intent.ACTION_CAMERA_BUTTON 监听网络变化 android.net.conn.CONNECTIVITY_CHANGE 关闭或打开飞行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED 设备当前设置被改变时 Intent.ACTION_CONFIGURATION_CHANGED 插入耳机时 Intent.ACTION_HEADSET_PLUG 未正确移除SD卡但已取出来时(正确移除方法:设置–SD卡和设备内存–卸载SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL 插入外部储存装置(如SD卡) Intent.ACTION_MEDIA_CHECKING 成功安装APK Intent.ACTION_PACKAGE_ADDED 成功卸载APK Intent.ACTION_PACKAGE_REMOVED 在系统中添加一个快捷方式 Intent.ADD_SHORTCUT_ACTION 列举所有可用的应用 Intent.ALL_APPS_ACTION 处理拨入的电话 Intent.ANSWER_ACTION 拨打电话,被呼叫的联系人在数据中指定 Intent.CALL_ACTION 拨打紧急电话号码 Intent.MERGENCY_DIAL_ACTION 日期改变 Intent.DATE_CHANGED_ACTION

BroadcastReceiver的创建

    在我们要创建自己的BroadcastReceiver时,需要继承android.content.BroadcastReceiver,并实现其onReceive方法。代码如下:

package com.example.receiver;import android.content.BroadcastReceiver;import android.content.Intent;  import android.util.Log; import android.content.Context;  public class MyReceiver() extends BroadcastReceiver{    @Override    public void onReceive(Context context, Intent intent){        //获取广播中携带的数据,有多种数据类型        String msg = intent.getStringExtra("key");         Log.d("MyReceiver:", "MyReceiver");    }}

BroadcastReceiver的注册

    BroadcastReceiver在创建后也需要先注册才能使用。在Android 的广播机制中,动态注册的BroadcastReceiver优先级是要高于静态注册。

①静态注册

    静态注册需要在AndroidManifest.xml文件中配置,代码如下:

<receiver android:name="com.example.receiver.MyReceiver">        <intent-filter>               <action        android:name="android.intent.action.MY_BROADCAST"        android:priority="999" /> <!-- 设置最高优先级 -->              <category android:name="android.intent.category.DEFAULT" />         </intent-filter>  </receiver>  

②动态注册

    动态注册的属于常驻型,这个广播接收者会在程序运行的整个过程中一直存在,不会被注销掉,当程序被退出后不会再接收到该广播。动态注册需要在代码中设置IntentFilter和注册BroadcastReceiver,代码如下:

MyReceiver myReceiver = new MyReceiver();           //创建IntentFilter IntentFilter intentFilter = new IntentFilter();  intentFilter .addAction("android.intent.action.MY_BROADCAST");  //注册registerReceiver(myReceiver, intentFilter);  

    动态注册的BroadcastReceiver跟随注册它组件相关联,所以在组件销毁时需要解除注册,否则系统会抛出一个异常。解除注册代码如下:

unregisterReceiver(myReceiver ); 

发送Broadcast

    广播接收器介绍完呢,那怎么发送广播呢,代码如下:

Intent intent = new Intent();  intent.setAction("android.intent.action.MY_BROADCAST");//在广播中放入数据,有多种参数类型的函数供使用intent.putExtra("key", "value");//发送普通广播sendBroadcast(intent);//发送有序广播  //receiverPermission为权限参数,如果为null则表示不要求接收者声明指定的权限,如果不为null,则表示接收者若要接收此广播,需声明指定权限。sendOrderedBroadcast(intent,receiverPermission);  
0 0