今天主要说明的是Activity(或者其中的View,通过传递Context即可)怎么与Service不断地交互信息;如果只是一开始的传递数据,完全可以通过在创建Service前通过Intent配合Bundle传递;如果需要来回交换一些状态信息或者动作命令(Action),则可以利用Broadcast和Receiver来实现。
Activity和Service都有自己的生命周期,当Activity退出时,Service仍可以在后台默默服务。这里就简单介绍一个例子,Activity通过按钮点击发送不同的动作命令给Service执行。而Service再通过广播返回信息类似。 在Activity的代码中,可以有如下语句:
1.首先是创建Service- Intent i = new Intent(this, MyService.class);
- i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
- i.putExtra("RunFlag", mbRunFlag);
- startService(i);
复制代码 如果从Activity传递的是简单数据类型,Intent中提供的非常全,如果是自定义类,可以通过Bundle来实现,下面有用到。其中,MyService继承自Service,里面实现了onStart()时所做的接收工作如下:- <span style="white-space:pre"> </span> @Override
- public void onStart(Intent intent, int startId)
- {
- // TODO Auto-generated method stub
- mbRunFlag = intent.getLongExtra("RunFlag", mbRunFlag);
- IntentFilter filter = new IntentFilter(SERVICE_COMMAND);
- //下面是开启的对广播的接收处理工作
- mReceiver = new MyServiceReceiver();
- registerReceiver(mReceiver,filter);
- super.onStart(intent, startId);
- Log.i("MyService", "MyService Start!");
- }
复制代码 2.当需要在运行中通过按钮等事件触发传递命令,使Service执行某些动作(Action)时,可以自定义类;这里首先是有个AbstractServiceCommand,实现了Serializable接口,各种具体命令继承即可,那么发送广播如下即可:其中的SERVICE_COMMAND是自定义的字符串,用于区分广播的或者传递的数据等;- SetRunFlagServiceCommand setRunFlagCmd= new SetRunFlagServiceCommand();
- setRunFlagCmd.setRunFlag(mbRunFlag);
- sendServiceCmd(setRunFlagCmd);
- Log.i(CLASS_TAG,setRunFlagCmd.printContent());
复制代码- protected void sendServiceCmd(AbstractServiceCommand cmd) {
- // TODO Auto-generated method stub
- Bundle bundle = new Bundle();
- bundle.putSerializable(SERVICE_COMMAND, cmd);
- Intent i = new Intent(SERVICE_COMMAND);
- i.putExtras(bundle);
- sendBroadcast(i);
- }
复制代码 3.实现接收- public class MyServiceReceiver extends BroadcastReceiver {
- public boolean mbRunFlagReceiver = false;
- @Override
- public void onReceive(Context context, Intent intent) {
- // TODO Auto-generated method stub
- Bundle bundle = intent.getExtras();
- AbstractServiceCommand serviceCmd = (AbstractServiceCommand) bundle.getSerializable(SERVICE_COMMAND);
- serviceCmd.executeCommand();
- Log.i(SERVICE_COMMAND,serviceCmd.printContent());
-
- }
- }
复制代码 最后是记得因为在Onstart()中注册了接收广播,用SERVICE_COMMAND作为过滤符;那在Service销毁时,要unregisterReceiver(mReceiver);
|