6.6 Android广播的生命周期

收听收音机就是一种广播,在收音机中有很多个广播电台,每个广播电台播放的内容都不相同。接收广播时广播(发送方)并不在意接收方接收到广播时如何处理。好比收听交通电台的广播,电台中告诉人们现在在交通状况如何,但它并不关心人们接收到广播时如何做出处理,这不是广播应该关心的问题。那么Android中的广播是如何操作的呢?这个问题将在本节的内容中进行解答。

6.6.1 Android的广播机制

在Android系统中有各种各样的广播,比如电池的使用状态、电话的接收和短信的接收都会产生一个广播,应用程序开发者也可以监听这些广播并做出程序逻辑的处理。图6-12演示了广播的运行机制。

图6-12 Android的广播机制

在Android系统中有各式各样的广播,具体运作流程如下所示。

(1)当“系统/应用”程序运行时会向Android注册各种广播。

(2)当Android接收到广播时,会判断哪种广播需要哪种事件。

(3)向不同需要事件的应用程序注册事件,不同的广播可能处理不同的事件,也可能处理相同的广播事件,这时就需要Android系统做筛选。例如在一个经典的电话黑名单应用程序中,首先通过将黑名单号码保存在数据库中,当来电时,我们接收到来电广播并将黑名单号码与数据库中的某个数据做匹配。如果匹配则做出相应的处理,例如挂掉电话和静音等。

6.6.2 编写广播程序

下面通过演示代码来讲解在Android中如何编写广播程序,在代码中设置了一个按钮,为按钮设置单击监听,通过单击发送广播,在后台中接收到广播并打印LOG信息:

        public class BroadCastActivity extends Activity {
            public static final String ACTION_INTENT_TEST = "com.terry.broadcast.test";
            /** Called when the activity is first created. */
            @Override
            public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                Button btn = (Button) findViewById(R.id.Button01);
                btn.setOnClickListener(new OnClickListener() {
                  @Override
                  public void onClick(View v) {
                     //TODO Auto-generated method stub
                      Intent intent = new Intent(ACTION_INTENT_TEST);
                      sendBroadcast(intent);
                  }
                });
            }
        }

接收器的代码如下所示:

        public class myBroadCast extends BroadcastReceiver {
            public myBroadCast() {
              Log.v("BROADCAST_TAG", "myBroadCast");
            }
            @Override
            public void onReceive(Context context, Intent intent) {
             //TODO Auto-generated method stub
              Log.v("BROADCAST_TAG", "onReceive");
            }
        }

在上面的接收器中,继承了BroadcastReceiver,并重写了它的onReceive,并构造了一个函数。当点击一下按钮,它向Android发送了一个广播,如图6-13所示。

图6-13 向Android发送了一个广播

如果此时再单击一下按钮,还是会再向Android系统发送广播,此时日志信息如图6-14所示。

图6-14 再次向Android系统发送广播

由此可以看出,Android广播的生命周期并不像Activity一样复杂,基本过程如图6-15所示。

图6-15 Android广播生命周期的过程

前面说过Android的广播各式各样,那么Android系统是如何帮人们处理需要哪种广播并提供相应的广播服务呢?读者需要注意,每当实现一个广播接收类时,必须在应用程序中的manifest中显式注明需要广播哪一个类,并为其设置过滤器,如图6-16所示。

图6-16 需要广播的类

其中action代表一个要执行的动作,在Andriod中有很多种action,例如ACTION_VIEW和ACTION_EDIT。

也可能有读者会问:如果在一个广播接收器中要处理多个动作呢?那要如何去处理?在Android的接收器中onReceive已经为我们想到的。同理,必须在Intent-filter中注册该动作,可以是系统的广播动作也可以是自己需要的广播,之后需要在onReceive方法中,通过intent.getAction()判断传进来的动作,这样即可做出不同的处理和不同的动作。