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()判断传进来的动作,这样即可做出不同的处理和不同的动作。