Android广播:Broadcast与BroadcastReceiver

Posted sq19920518

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android广播:Broadcast与BroadcastReceiver相关的知识,希望对你有一定的参考价值。

一、广播简介

1. 广播传播机制:

  广播接收器,也被称为全局事件,或系统事件。
  当android系统中任何程序有动作时,如果想通知其他程序,采用广播的方式进行传播是非常有效的。广播从理论上说,可以将一个动作传播给任意多个程序(当然,广播接收器的数量会收到系统限制)。
  在Android中,有一些操作完成以后,会发送广播,比如说发出一条短信,或打出一个电话,如果某个程序接收了这个广播,就会做相应的处理。这个广播跟我们传统意义中的电台广播有些相似之处。之所以叫做广播,就是因为它只负责“说”而不管你“听不听”,也就是不管你接收方如何处理。另外,广播可以被不只一个应用程序所接收,当然也可能不被任何应用程序所接收。
  广播机制最大的特点就是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的。
  Android中广播的是操作系统中产生的各种各样的事件。例如,收到一条短信就会产生一个收到短信息的事件。而Android操作系统一旦内部产生了这些事件,就会向所有的广播接收器对象来广播这些事件。

2. 广播传播机制的三要素:

  Android广播机制包含三个基本要素:
  1、广播(Broadcast) - 用于发送广播;
  2、广播接收器(BroadcastReceiver) - 用于接收广播;
  3、意图内容(Intent)-用于保存广播相关信息的媒介。

3. 广播的分类:

  • 普通广播 (Normal broadcast)
       a. 所有监听该广播接受者都可以监听到该广播
       b. 同级别接收先后顺序是随机的(无序)
       c. 级别低的后收到广播
       d. 接收器不能截断广播的继续传播,也不能处理广播
       e. 同级别动态注册高于静态注册
  • 有序广播 (Oredered broadcast)
       a. 按照接收者的优先顺序来接收广播,优先级别在intent-filter中的priority中声明,-1000到1000之间,
       值越大优先级越高,可以终止广播的继续传播,接受者可以修改intent的内容。
       b. 同级别接收先后顺序是随机的(无序)
       c. 级别低的后收到广播
       d. 能截断广播的继续传播,高级别的广播接收器接收广播后能决定是否截断。
       e. 能处理广播
       f. 同级别动态注册高于静态注册
  • 异步广播 (粘滞性滞留广播) ps:已被弃用
       a. 不能处理结果给下一个接收者,无法终止广播。
       b. 一直存在
       c. 可以先发送广播,再注册接收器
       d. 需要在清单文件添加android.permission.BROADCAST_STICKY权限

4. 发送广播:

  把信息装入一个Intent对象(如:Action、Category),通过调相应的方法将Intent对象以广播的方式发送出去:
  sendBroadcast();
  sendOrederBroadcast();
  sendStickyBroadcast();

二、广播接收器BroadcastReceiver

1. 概念:

  BroadcastReceiver(广播接收器)是为了实现系统广播而提供的一种组件,并且广播事件处理机制是系统级别的。比如,我们可以发出一种广播来测试是否收到短信,这时候就可以定义一个BraodcastReceiver来接受广播,当收到短信时提示用户。我们既可以用Intent来启动一个组件,也可以用sendBroadcast()方法发起一个系统级别的事件广播来传递消息。
  我们也可以在自己的应用程序中开发BroadcastReceiver,然后把广播接收器这个类或者对象注册到Android操作系统上去,让操作系统知道现在有这样一个广播接收器正在等待接收Android操作系统的广播,即在自己的应用程序中实现BroadcastReceiver来监听和响应广播的Intent。
  当有广播事件产生时,Android操作系统首先告诉注册到其上面的广播接收器产生了一个怎么样的事件,每个接收器首先判断是不是我这个接收器需要的事件,如果是它所需要的事件,再进行相应的处理。
  例子:我们把骚扰电话的黑名单放到数据库中去,当接到电话时会产生一个接电话事件,事先在Android操作系统中注册一个BroadcastReceiver的对象,当产生事件的时候,会通知我们的广播接收器对象,接收器对象接收到消息之后,就会到数据库里面去取所有黑名单电话和接到的这个电话号码进行比较,如果匹配就直接挂掉。

2. 生命周期:

  1、广播接收器仅在它执行这个方法时处于活跃状态。当onReceive()返回后,它即为失活状态
  2、拥有一个活跃状态的广播接收器的进程被保护起来而不会被杀死,但仅拥有失活状态组件的进程则会在其它进程需要它所占有的内存的时候随时被杀掉。
  3、如果响应一个广播信息需要很长的一段时间,一般会将其纳入一个子线程中去完成,而不是在主线程内完成它,从而保证用户交互过程的流畅。广播接收程序的时间限制为10秒。(注意不要直接在onReceive()方法中创建新线程)

3. 注册BroadcastReceiver:

  BroadcastReceiver用于监听被广播的事件(Intent),为了达到这个目的,BroadcastReceiver必须进行注册,注册的方法有以下两种:
3.1 静态注册
  静态注册——即,在AndroidManifest.xml的application里面定义receiver并设置要接收的action。
  如果在清单配置文件中配置了广播接收器,那么程序在安装后会自动注册广播接收器。
  静态注册方式的特点:不管该应用程序是否处于活动状态,都会进行监听。
  

<receiver
    android:name=".MessageReceiver"
    android:enabled="true"
    android:exported="true">
    <intent-filter android:priority="1">

        <!-- 监听短信 -->
        <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
    </intent-filter>
</receiver>

  其中,MessageReceiver为继承BroadcastReceiver的类,重写了onReceiver方法,并在onReceiver方法中对广播进行处理。intent-filter标签设置过滤器,接收指定action广播。
3.2 动态注册
  动态注册——即,在activity里面调用当前上下文对象的registerReceiver() 方法来注册。
  和静态的注册差不多,一个形参是receiver对象,另一个是IntentFilter对象。而IntentFilter构造方法的参数是要接收的action。
  动态注册方式特点:在代码中进行注册后,当应用程序关闭后,就不再进行监听。
  补充:动态注册广播接收器的特点,就是当用来注册的 Activity 关掉后,广播也就失效了。同时反映了静态注册的一个优势,就是无需担忧广播接收器是否被关闭,只要设备是开启状态,广播接收器就是打开着的。
  

 ScreenReceiver screenReceiver = new ScreenReceiver();
 IntentFilter filter = new IntentFilter();
 // 监听锁屏
 filter.addAction(Intent.ACTION_SCREEN_OFF);
 // 解锁屏幕
 filter.addAction(Intent.ACTION_SCREEN_ON);

  其中,screenReceiver 为继承BroadcastReceiver的类,重写了onReceiver方法,并在onReceiver方法中对广播进行处理。IntentFilter对象调用addAction()方法设置过滤器,接收指定action广播。

4. 广播接收器的优先级:

<receiver android:name=".EngineerReceiver">
    // priority属性表示广播的优先级,数值越大优先级越高,该接收器也就越先收到广播
    <intent-filter android:priority="1">
         <action android:name="MyOrderedBroadcast_Send"/>
    </intent-filter>
</receiver>

5. 接收广播:

  当Intent发送之后,所有已经注册BroadcastReceiver会检查注册时的IntentFilter是否与发送的Intent相匹配,若匹配则就会调用BroadcastReceiver的onReceiver()方法。所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceiver()方法。
  【注意】:BroadReceiver生命周期只有十秒左右,不能直接执行耗时操作,不然会出现ANR(应用程序无响应),也不能用子线程来做,因为每次广播来的时候都会创建一个Reveiver对象,并且调用onReceiver,执行完之后 ,对象会立刻被销毁,子线程也没了。要做耗时操作的话,应该通过发送Intent给Service,由Service来完成。
  动态注册广播接受者,要在onStop回调方法中注销广播接收器unregisterReceiver(receiver);

6. 注销BroadcastReceiver:

  1. 一般在onStart中注册BroadcastReceiver,在onStop中取消BroadcastReceiver。
  2. 一个BroadcastReceiver 对象只有在被调用onReceive(Context, Intent)时才有效,当从该方法返回后,该对象就无效了,结束生命周期。

三、案例演示

1. 接收系统广播

MainActivity 类

package com.danny_jiang.day21_systembroadcast;

import android.app.Activity;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;

/**
 * 创建广播接收器的步骤:
 * 1 自定义类继承BroadcastReceiver类
 * 2 复写onReceive方法,接收广播并做相应的操作
 * 3 注册广播:静态注册、动态注册
 *  静态注册:
 *      AndroidManifest.xml文件中使用receiver标签注册
 *          需要指定name属性,指定使用的是哪一个广播接收器
 *          需要指定action,指定需要接收的哪一类广播
 * 
 * 注意:有些广播需要添加权限
 *
 */
public class MainActivity extends Activity 

    private ScreenReceiver screenReceiver;
    private IntentFilter filter;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 屏幕唤醒和休眠广播只能在代码中注册,如果在清单配置文件中注册将不起作用
        screenReceiver = new ScreenReceiver();
        filter = new IntentFilter();
        filter.addAction(Intent.ACTION_SCREEN_OFF);
        filter.addAction(Intent.ACTION_SCREEN_ON);
    

    @Override
    protected void onStart() 
        super.onStart();
        // 注册广播,一般放在onStart方法中
        registerReceiver(screenReceiver, filter);
    

    @Override
    protected void onStop() 
        super.onStop();
        // 注销广播,一般放在onStop方法中
        unregisterReceiver(screenReceiver);
    

A. 短信接收与拦截

package com.danny_jiang.day21_systembroadcast;

import android.app.NotificationManager;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v4.app.NotificationCompat;
import android.telephony.SmsMessage;

/**
 * 接收短信的广播接收器 
 * 当接收到短信广播之后,解析广播中的内容,发送通知提示用户收到短信内容
 * Protocol Data Unit  (PDU:协议数据单元)
 */
public class SmsReceiver extends BroadcastReceiver 

    @Override
    public void onReceive(Context context, Intent intent) 
        String phoneNum = "";// 短信号码
        StringBuilder sb = new StringBuilder();// 短信内容

        Bundle bundle = intent.getExtras();
        Object[] objs = (Object[]) bundle.get("pdus");// pdus协议数据单元

        for (Object obj : objs) 
            SmsMessage sm = SmsMessage.createFromPdu((byte[]) obj);

            // 通过SmsMessage获取发送短信的号码
            phoneNum = sm.getOriginatingAddress();

            // 通过SmsMessage获取发送短信的正文
            String body = sm.getMessageBody();
            sb.append(body);
        
        android.util.Log.e("TAG",
                "接收到短信 号码: " + phoneNum + " 内容: " + sb.toString());

        NotificationCompat.Builder builder = new NotificationCompat.Builder(
                context);
        builder.setSmallIcon(R.drawable.ic_launcher);
        builder.setTicker("来短信了,别玩啦");
        builder.setContentTitle("号码 " + phoneNum);
        builder.setContentText(sb.toString());

        NotificationManager manager = (NotificationManager) context
                .getSystemService(Context.NOTIFICATION_SERVICE);
        manager.notify(1, builder.build());

        // 中断广播,短信发送是有序广播,中断广播之后系统将收不到广播(即收不到短信)
        // (前提是该广播接收者的优先级要大于系统广播接收者的优先级)
        abortBroadcast();
    

B. 监听网络连接状态

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.widget.Toast;

/**
 * 接收网络连接状态发送改变的广播接收器
 */
public class ConnetivityChangeReceiver extends BroadcastReceiver

    /**
     * 当手机网络连接状态发生改变之后,此方法会被调用
     */
    @Override
    public void onReceive(Context context, Intent intent) 
        /*
         * 监听手机网络是否已经连上 
         */
        // 第一步:获取系统服务ConnectivityManager连接管理器
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(
                Context.CONNECTIVITY_SERVICE);

        // 第二步:获取手机的网络连接描述对象
        NetworkInfo netWorkInfo = cm.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);

        // 第三步:通过网络连接描述对象获取当前的状态
        NetworkInfo.State state = netWorkInfo.getState();

        if(state == NetworkInfo.State.CONNECTED) 
            Toast.makeText(context, "手机网络已连接,请注意流量费用", 
                    Toast.LENGTH_SHORT).show();
         else 
            Toast.makeText(context, "手机网络已断开,请检查网络设置", 
                    Toast.LENGTH_SHORT).show();
        
    

C. 监听系统开机

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * 接收系统开机的广播
 */
public class BootCompletedReceiver extends BroadcastReceiver

    /**
     * 当接收到系统已经完成开机的广播之后,此方法会被调用
     */
    @Override
    public void onReceive(Context context, Intent intent) 
        Toast.makeText(context, "开机完成", Toast.LENGTH_SHORT).show();
        android.util.Log.e("TAG", "开机完成");
    

D. 监听电话状态

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.TelephonyManager;

public class PhoneReceiver extends BroadcastReceiver 

    @Override
    public void onReceive(Context context, Intent intent) 
        // 获得一个电话管理器
        TelephonyManager manager = (TelephonyManager) context
                .getSystemService(Context.TELEPHONY_SERVICE);
        Bundle bundle = intent.getExtras();

        // 获得来电号码
        String phoneNumber = bundle
                .getString(TelephonyManager.EXTRA_INCOMING_NUMBER);

        // 获得当前通话状态
        int callState = manager.getCallState();

        switch (callState) 
        case TelephonyManager.CALL_STATE_RINGING:
            // 电话响铃
            android.util.Log.e("TAG", "响铃");
            break;
        case TelephonyManager.CALL_STATE_OFFHOOK:
            // 接通电话
            android.util.Log.e("TAG", "接通电话");
            break;
        case TelephonyManager.CALL_STATE_IDLE:
            // 挂断电话
            android.util.Log.e("TAG", "挂断电话");
            break;
        default:
            break;
        
    

E. 监听解屏与锁屏状态

package com.danny_jiang.day21_systembroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

public class ScreenReceiver extends BroadcastReceiver 

    @Override
    public void onReceive(Context context, Intent intent) 
        String action = intent.getAction();
        if (Intent.ACTION_SCREEN_OFF.equals(action)) 
            android.util.Log.e("TAG", "锁屏");
         else if (Intent.ACTION_SCREEN_ON.equals(action)) 
            android.util.Log.e("TAG", "开屏");
        
    

AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.danny_jiang.day21_systembroadcast"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- 申请接收系统开机完成的广播权限 -->
    <uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
    <!-- 申请接收网络连接状态发生改变的广播权限 -->
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <!-- 申请接收短信广播的权限 -->
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <!-- 申请接收电话接听状态发生改变的广播权限 -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    <!-- 申请接收屏幕解屏与锁屏发生改变的广播权限 -->
    <uses-permission android:name="android.permission.DISABLE_KEYGUARD"/>

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 
               静态注册:
               在AndroidManifest.xml文件中通过receiver标签注册
               即使程序没有打开,也会接收到所注册的广播信息(3.2版本之后,APP必须运行过一次)
         -->

        <!--接收系统开机的广播-->
        <receiver android:name=".BootCompletedReceiver">
            <intent-filter >
                <!-- 以下action表示的是系统发送开机完成的广播action -->
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>

        <!-- 注册网络连接状态发送改变的广播接收器 -->
        <receiver android:name=".ConnetivityChangeReceiver">
            <intent-filter >
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>

        <!-- 注册接收短信的广播接收器 -->
        <receiver android:name=".SmsReceiver">
            <intent-filter >
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>

        <!-- 注册电话接听状态发送改变的广播接收器 -->
        <receiver android:name=".PhoneReceiver">
            <intent-filter >
                <action android:name="android.intent.action.PHONE_STATE"/>
            </intent-filter>
        </receiver>

        <!-- 注册屏幕解屏与锁屏状态发送改变的广播接收器 -->
        <receiver android:name=".ScreenReceiver">
        </receiver>
    </application>

</manifest>

2. 自定义广播的发送与接收

MainActivity 类

package com.danny_jiang.day21_sendbroadcast;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;

public class MainActivity extends Activity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    

    /**
     * 发送普通广播
     * @param view
     */
    public void sendNormal(View view) 
        // 初始化意图Intent
        Intent intent = new Intent();

        // 添加活动(频道)
        intent.setAction("MyBroad_Jiang");

        // 向广播中添加数据
        intent.putExtra("pdus", "各部门注意了: 明天加班");

        // 发送广播
        sendBroadcast(intent);
    

    /**
     * 发送有序广播
     * @param view
     */
    public void sendOrder(View view) 
        Intent intent = new Intent();

        intent.setAction("MyOrderedBroadcast_Jiang");

        intent.putExtra("data", "客户已打款100W,需要在3个月之内完成");

        /**
         * 第一个参数:发送广播的意图对象
         * 第二个参数:发送广播的权限
         * 第三个参数:最终广播接收器,不管广播是否终止,都会接收到此广播消息
         */
        sendOrderedBroadcast(intent, "permission.danny_jiang", new BroadcastReceiver() 

            @Override
            public void onReceive(Context context, Intent intent) 
                android.util.Log.e("danny", "最后的小兵接收到消息");
            
        , null, 0, "信息务必准确", null);
    

广播接收器:接收普通广播

package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

/**
 * 接收普通广播
 *
 */
public class MyReceiver extends BroadcastReceiver

    @Override
    public void onReceive(Context context, Intent intent) 
        String info = intent.getStringExtra("pdus");
        Toast.makeText(context, "收到邮件:" + info, Toast.LENGTH_SHORT).show();
    

广播接收器:接收有序广播

package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 接收有序广播
 *
 */
public class ExecutiveReceiver extends BroadcastReceiver

    @Override
    public void onReceive(Context context, Intent intent) 
        String content = intent.getStringExtra("data");
        android.util.Log.e("danny", "总监接收到总部发送内容:" + content);

        //通过getResultData可以获取此有序广播中的DATA数据
        String initialData = getResultData();
        android.util.Log.e("danny", "附加信息是 " + initialData);

        // 处理广播发送的信息
        setResultData("收到客户打款50W,需求在2个月之内完成");
    
package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 接收有序广播
 *
 */
public class ManagerReceiver extends BroadcastReceiver

    @Override
    public void onReceive(Context context, Intent intent) 
        String content = intent.getStringExtra("data");
        android.util.Log.e("danny", "总经理接收到总部发送内容:" + content);

        //通过getResultData可以获取此有序广播中的DATA数据
        String data = getResultData();
        android.util.Log.e("danny", "总经理收到总监发送的通知内容 " + data);

        //setResultData("客户打款20W,需求在1个月内完成");

        //停止向下发送有序广播
        abortBroadcast();
    

package com.danny_jiang.day21_sendbroadcast;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;

/**
 * 接收有序广播
 *
 */
public class EngineerReceiver extends BroadcastReceiver

    @Override
    public void onReceive(Context context, Intent intent) 
        String content = intent.getStringExtra("data");
        android.util.Log.e("danny", "工程师接收到总部发送内容:" + content);

        //通过getResultData可以获取此有序广播中的DATA数据
        String data = getResultData();
        android.util.Log.e("danny", "工程师收到经理发送的通知内容 " + data);
    

AndroidManifest.xml文件:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.danny_jiang.day21_sendbroadcast"
    android:versionCode="1"
    android:versionName="1.0" >

    <!-- 创建权限 -->
    <permission android:name="permission.danny_jiang"
        android:protectionLevel="normal"></permission>
    <!-- 申请权限 -->
    <uses-permission android:name="permission.danny_jiang"/>

    <uses-sdk
        android:minSdkVersion="14"
        android:targetSdkVersion="14" />

    <application
        android:allowBackup="true"
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

        <!-- 注册接收普通广播的接收器 -->
        <receiver android:name=".MyReceiver">
            <intent-filter >
                <action android:name="MyBroad_Jiang"/>
            </intent-filter>
        </receiver>

        <!-- 注册有序广播接收器 -->
        <receiver android:name=".EngineerReceiver">
            <intent-filter android:priority="1">
                <action android:name="MyOrderedBroadcast_Jiang"/>
            </intent-filter>
        </receiver>

        <!-- 注册有序广播接收器 -->
        <receiver android:name=".ExecutiveReceiver">
            <!-- 在intent-filter中通过priority可以设置有序广播接收器的优先级 -->
            <intent-filter android:priority="3">
                <action android:name="MyOrderedBroadcast_Jiang"/>
            </intent-filter>
        </receiver>

        <!-- 注册有序广播接收器 -->
        <receiver android:name=".ManagerReceiver">
            <intent-filter android:priority="2">
                <action android:name="MyOrderedBroadcast_Jiang"/>
            </intent-filter>
        </receiver>
    </application>

</manifest>

四、Android系统广播大全

  1. String ADD_SHORTCUT_ACTION 动作:在系统中添加一个快捷方式。
  2. String ALL_APPS_ACTION 动作:列举所有可用的应用。输入:无。
  3. String ALTERNATIVE_CATEGORY 类别:说明 activity 是用户正在浏览的数据的一个可选操作。
  4. String ANSWER_ACTION 动作:处理拨入的电话。
  5. String XMPP_DISCONNECTED_ACTION 广播:XMPP 连接已经被断开。
  6. String BATTERY_CHANGED_ACTION 广播:充电状态,或者电池的电量发生变化。
  7. String BOOT_COMPLETED_ACTION 广播:在系统启动后,这个动作被广播一次(只有一次)。
  8. String BROWSABLE_CATEGORY 类别:能够被浏览器安全使用的 activities 必须支持这个类别。
  9. String BUG_REPORT_ACTION 动作:显示 activity 报告错误。
  10. String CALL_ACTION 动作:拨打电话,被呼叫的联系人在数据中指定。
  11. String CALL_FORWARDING_STATE_CHANGED_ACTION 广播:语音电话的呼叫转移状态已经改变。
  12. String CLEAR_CREDENTIALS_ACTION 动作:清除登陆凭证 (credential)。
  13. String CONFIGURATION_CHANGED_ACTION 广播:设备配置信息已经改变,参见Resources.Configuration.
  14. Creator CREATOR 无 无
  15. String DATA_ACTIVITY_STATE_CHANGED_ACTION 广播:电话的数据活动(data activity)状态(即收发数据的状态)已经改变。
  16. String DATA_CONNECTION_STATE_CHANGED_ACTION 广播:电话的数据连接状态已经改变。
  17. String DATE_CHANGED_ACTION 广播:日期被改变。
  18. String DEFAULT_ACTION 动作:和 VIEW_ACTION 相同,是在数据上执行的标准动作。
  19. String DEFAULT_CATEGORY 类别:如果 activity 是对数据执行确省动作(点击, center press)的一个选项,需要设置这个类别。
  20. String DELETE_ACTION 动作:从容器中删除给定的数据。
  21. String DEVELOPMENT_PREFERENCE_CATEGORY 类别:说明 activity 是一个设置面板 (development preference panel).
  22. String DIAL_ACTION 动作:拨打数据中指定的电话号码。
  23. String EDIT_ACTION 动作:为制定的数据显示可编辑界面。
  24. String EMBED_CATEGORY 类别:能够在上级(父)activity 中运行。
  25. String EMERGENCY_DIAL_ACTION 动作:拨打紧急电话号码。
  26. int FORWARD_RESULT_LAUNCH 启动标记:如果这个标记被设置,而且被一个已经存在的 activity 用来启动新的 activity,已有 activity 的回复目标 (reply target) 会被转移给新的 activity。
  27. String FOTA_CANCEL_ACTION 广播:取消所有被挂起的 (pending) 更新下载。
  28. String FOTA_INSTALL_ACTION 广播:更新已经被确认,马上就要开始安装。
  29. String FOTA_READY_ACTION 广播:更新已经被下载,可以开始安装。
  30. String FOTA_RESTART_ACTION 广播:恢复已经停止的更新下载。
  31. String FOTA_UPDATE_ACTION 广播:通过 OTA 下载并安装操作系统更新。
  32. String FRAMEWORK_INSTRUMENTATION_TEST_CATEGORY 类别:To be used as code under test for framework instrumentation tests.
  33. String GADGET_CATEGORY 类别:这个 activity 可以被嵌入宿主 activity (activity that is hosting gadgets)。
  34. String GET_CONTENT_ACTION 动作:让用户选择数据并返回。
  35. String HOME_CATEGORY 类别:主屏幕 (activity),设备启动后显示的第一个 activity。
  36. String INSERT_ACTION 动作:在容器中插入一个空项 (item)。
  37. String INTENT_EXTRA 附加数据:和 PICK_ACTIVITY_ACTION 一起使用时,说明用户选择的用来显示的 activity;和 ADD_SHORTCUT_ACTION 一起使用的时候,描述要添加的快捷方式。
  38. String LABEL_EXTRA 附加数据:大写字母开头的字符标签,和 ADD_SHORTCUT_ACTION 一起使用。
  39. String LAUNCHER_CATEGORY 类别:Activity 应该被显示在顶级的 launcher 中。
  40. String LOGIN_ACTION 动作:获取登录凭证。
  41. String MAIN_ACTION 动作:作为主入口点启动,不需要数据。
  42. String MEDIABUTTON_ACTION 广播:用户按下了“Media Button”。
  43. String MEDIA_BAD_REMOVAL_ACTION 广播:扩展介质(扩展卡)已经从 SD 卡插槽拔出,但是挂载点 (mount point) 还没解除 (unmount)。
  44. String MEDIA_EJECT_ACTION 广播:用户想要移除扩展介质(拔掉扩展卡)。
  45. String MEDIA_MOUNTED_ACTION 广播:扩展介质被插入,而且已经被挂载。
  46. String MEDIA_REMOVED_ACTION 广播:扩展介质被移除。
  47. String MEDIA_SCANNER_FINISHED_ACTION 广播:已经扫描完介质的一个目录。
  48. String MEDIA_SCANNER_STARTED_ACTION 广播:开始扫描介质的一个目录。
  49. String MEDIA_SHARED_ACTION 广播:扩展介质的挂载被解除 (unmount),因为它已经作为 USB 大容量存储被共享。
  50. String MEDIA_UNMOUNTED_ACTION 广播:扩展介质存在,但是还没有被挂载 (mount)。
  51. String MESSAGE_WAITING_STATE_CHANGED_ACTION 广播:电话的消息等待(语音邮件)状态已经改变。
  52. int MULTIPLE_TASK_LAUNCH 启动标记:和 NEW_TASK_LAUNCH 联合使用,禁止将已有的任务改变为前景任务 (foreground)。
  53. String NETWORK_TICKLE_RECEIVED_ACTION 广播:设备收到了新的网络 “tickle” 通知。
  54. int NEW_TASK_LAUNCH 启动标记:设置以后,activity 将成为历史堆栈中的第一个新任务(栈顶)。
  55. int NO_HISTORY_LAUNCH 启动标记:设置以后,新的 activity 不会被保存在历史堆栈中。
  56. String PACKAGE_ADDED_ACTION 广播:设备上新安装了一个应用程序包。
  57. String PACKAGE_REMOVED_ACTION 广播:设备上删除了一个应用程序包。
  58. String PHONE_STATE_CHANGED_ACTION 广播:电话状态已经改变。
  59. String PICK_ACTION 动作:从数据中选择一个项目 (item),将被选中的项目返回。
  60. String PICK_ACTIVITY_ACTION 动作:选择一个 activity,返回被选择的 activity 的类(名)。
  61. String PREFERENCE_CATEGORY 类别:activity是一个设置面板 (preference panel)。
  62. String PROVIDER_CHANGED_ACTION 广播:更新将要(真正)被安装。
  63. String PROVISIONING_CHECK_ACTION 广播:要求 polling of provisioning service 下载最新的设置。
  64. String RUN_ACTION 动作:运行数据(指定的应用),无论它(应用)是什么。
  65. String SAMPLE_CODE_CATEGORY 类别:To be used as an sample code example (not part of the normal user experience).
  66. String SCREEN_OFF_ACTION 广播:屏幕被关闭。
  67. String SCREEN_ON_ACTION 广播:屏幕已经被打开。
  68. String SELECTED_ALTERNATIVE_CATEGORY 类别:对于被用户选中的数据,activity 是它的一个可选操作。
  69. String SENDTO_ACTION 动作:向 data 指定的接收者发送一个消息。
  70. String SERVICE_STATE_CHANGED_ACTION 广播:电话服务的状态已经改变。
  71. String SETTINGS_ACTION 动作:显示系统设置。输入:无。
  72. String SIGNAL_STRENGTH_CHANGED_ACTION 广播:电话的信号强度已经改变。
  73. int SINGLE_TOP_LAUNCH 启动标记:设置以后,如果 activity 已经启动,而且位于历史堆栈的顶端,将不再启动(不重新启动) activity。
  74. String STATISTICS_REPORT_ACTION 广播:要求 receivers 报告自己的统计信息。
  75. String STATISTICS_STATE_CHANGED_ACTION 广播:统计信息服务的状态已经改变。
  76. String SYNC_ACTION 动作:执行数据同步。
  77. String TAB_CATEGORY 类别:这个 activity 应该在 TabActivity 中作为一个 tab 使用。
  78. String TEMPLATE_EXTRA 附加数据:新记录的初始化模板。
  79. String TEST_CATEGORY 类别:作为测试目的使用,不是正常的用户体验的一部分。
  80. String TIMEZONE_CHANGED_ACTION 广播:时区已经改变。
  81. String TIME_CHANGED_ACTION 广播:时间已经改变(重新设置)。
  82. String TIME_TICK_ACTION 广播:当前时间已经变化(正常的时间流逝)。
  83. String UMS_CONNECTED_ACTION 广播:设备进入 USB 大容量存储模式。
  84. String UMS_DISCONNECTED_ACTION 广播:设备从 USB 大容量存储模式退出。
  85. String UNIT_TEST_CATEGORY 类别:应该被用作单元测试(通过 test harness 运行)。
  86. String VIEW_ACTION 动作:向用户显示数据。
  87. String WALLPAPER_CATEGORY 类别:这个 activity 能过为设备设置墙纸。
  88. String WALLPAPER_CHANGED_ACTION 广播:系统的墙纸已经改变。
  89. String WALLPAPER_SETTINGS_ACTION 动作:显示选择墙纸的设置界面。输入:无。
  90. String WEB_SEARCH_ACTION 动作:执行 web 搜索。
  91. String XMPP_CONNECTED_ACTION 广播:XMPP 连接已经被建立。

更多有关Broadcast回调更新UI控件,参考博客http://blog.csdn.net/niubitianping/article/details/51925048
转载此博客请注明出处http://blog.csdn.net/sq19920518/article/details/52625100

以上是关于Android广播:Broadcast与BroadcastReceiver的主要内容,如果未能解决你的问题,请参考以下文章

Android Broadcast Receiver (广播接收者)

Android系统广播(Broadcast)注册,发送,接收流程解析

Broadcast Server

广播(Broadcast)

Android入门第48天-静态BroadCast之接受开机广播

Android安全笔记-Broadcast基本概念