由于项目需要,我们有时候需要在service中处理耗时操作,然后将结果发送给activity以更新状态。通常情况下,我们只需要在一个service与一个activity之间通信,通常这种情况下,我们使用最多的是通过回调接口。具体做法是在service中定义一个接口,在activity中实现该接口,并通过bindservice来传入。实现方式很简单,在此不再赘述。
当需要将service中的结果一次发送给多个activity时,我们又该如何实现呢?经过多个项目的积累,总结了三种实现的方式。分别是回调接口、广播接收者和观察者模式。
1.回调接口的方式,与单个service与单个activity通信类似,只是将service中的接口变为接口的集合,每个需要通信的activity都实现接口,然后在获取结果后,循环调用集合中的实现类,来与多个activity进行通信,代码如下:
Service类:
package com.example.servicecallback; import java.util.ArrayList; import java.util.List; import android.app.Service; import android.content.Intent; import android.os.Binder; import android.os.Handler; import android.os.IBinder; import android.os.Message; import android.util.Log; public class ContentService extends Service { //回调接口的集合 private List<Callback> list; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return new LocalBinder(); } @Override public void onCreate() { // TODO Auto-generated method stub super.onCreate(); list = new ArrayList<Callback>(); } public final class LocalBinder extends Binder { public ContentService getService() { return ContentService.this; } } /** * 回调接口 * @author Ivan Xu * */ public interface Callback { public void getPerson(Person person); } /** * 往回调接口集合中添加一个实现类 * @param callback */ public void addCallback(Callback callback) { list.add(callback); } public void asyncSendPerson(final String name) { // 休息5秒,模拟异步任务 new Thread(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try { Thread.sleep(5000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } handler.sendMessage(handler.obtainMessage(0, name)); } }).start(); } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { // TODO Auto-generated method stub String name = (String) msg.obj; Log.i("ContentService", "---name-->" + name); Person person = new Person(); person.setName(name); Log.i("ContentService", "---list.size()-->" + list.size()); Log.i("ContentService", "---person-->" + person.toString()); //遍历集合,通知所有的实现类,即activity for (int i = 0; i < list.size(); i++) { list.get(i).getPerson(person); } } }; }