Action+ IntentService架构
这一部分给大家总结一下mms里面对于后台任务的处理。正常情况下,一个互联网应用可能会涉及到n多的后台任务要运行,短信应用也不例外,例如插入短信到数据库,删除短信,标记为已读,发送短信,接收短信,下载彩信等。这些都是耗时任务,并且他们之间有些还有先后顺序要求,如果没有一个良好的后台任务管理框架,拿维护起来可就要了亲命了。
这里我们就来看一下mms应用中的“Action+IntentService架构”是怎么解决这个问题的。
先简单看一下Action:
public abstract class Action implements Parcelable {
..........................................
public void start() {
DataModel.startActionService(this);
}
//该Action要执行的具体后台任务放在这里,该方法需要我们继承的
//Action子类实现
protected Object executeAction() {
return null;
}
..........................................
//需要在该Action之后执行的Action放到mBackgroundActions中,在该Action执行完
//之后会将这些mBackgroundActions取出来执行
private final List<Action> mBackgroundActions = new LinkedList<Action>();
protected void requestBackgroundWork(final Action backgroundAction) {
LogUtil.i(TAG, "requestBackgroundWork");
mBackgroundActions.add(backgroundAction);
}
protected Bundle doBackgroundWork() throws DataModelException {
return null;
}
..........................................
}
我们大致上就可以了解Action是什么了?简单的来说,可以理解成一个Runnable,在executeAction方法中是具体的后台任务逻辑,类似于run方法。但显然
Action比Runnable复杂一些,多维护了一个mBackgroundActions列表,他是一个List<Action>,维护的是需要在该Action执行之后再执行的Action,当然这些都是由Action对象本身维护和触发,是典型的面向对象的设计。这样的设计无疑给繁杂的后台任务维护指明了一条简单清晰的框架:谁关联谁维护。这样就不需要我们整体上再维护Action队列来决定先后顺序了,是一个非常不错的设计。
我们再来以短信发送过程为例来说明: