这是我现在要做的:
我有一个在后台运行并读取用户位置的服务。每次读取有效位置(有一些参数,如距离和时间)时,都会启动 IntentService 以将该位置发送到 Web 服务器
使用跟踪服务的应用程序也有一些网络调用,具体取决于用户按下的选项。现在,应用程序只是在 asynctask 中调用 Web 服务。
一些代码:位置服务触发 IntentService,每次收到一个好的位置,像这样:
Intent intentService = new Intent(LocationLoggerService.this, LocationManagerIntentService.class);
intentService.putExtra(Constants.MESSAGE_LOCATION, readLocation);
startService(intentService);
意图服务处理意图:
@Override
protected void onHandleIntent(Intent intent) {
LocationInfo location = intent.getExtras().getParcelable(Constants.MESSAGE_LOCATION);
.... //Do the web call and broadcast result to app
}
以下是我需要进行的更改:
IntentService 和应用程序不能同时调用 Web 服务器。由于现在已经实施,这是不可能的,因为它们是独立的。我正在考虑通过为所有这些调用创建意图,将应用程序中的所有 Web 调用传递给 IntentService。这行得通吗?如果有位置网络发送,来自应用程序调用的新意图将被放入队列并在当前调用之后立即执行?
如果由于网络速度低而队列中有多个位置发送,则应用调用需要放在队列前面,而不是等待所有现有意图完成,仅等待当前意图。有没有办法将意图放在队列之上?
谢谢你。
后期编辑:
这是我所做的更改。
- 创建自定义意图服务
public abstract class PriorityIntentService extends Service { private final AtomicInteger intentsCount = new AtomicInteger(); protected void intentFinished() { intentsCount.decrementAndGet(); } private final class ServiceHandler extends Handler { public ServiceHandler(Looper looper) { super(looper); } public final boolean sendPriorityMessage(Message msg) { intentsCount.incrementAndGet(); int priority = msg.arg2; if (priority == 0) { return sendMessageAtFrontOfQueue(msg); } else { return sendMessage(msg); } } @Override public void handleMessage(Message msg) { onHandleIntent((Intent) msg.obj); if (intentsCount.get() == 0) { // stopSelf(msg.arg1); stopSelf(); } } } @Override public void onStart(Intent intent, int startId) { Message msg = mServiceHandler.obtainMessage(); msg.arg1 = startId; msg.obj = intent; if (intent.getExtras().getInt(Constants.MESSAGE_PRIORITY) == 0) { msg.arg2 = 0; } else { msg.arg2 = 1; } mServiceHandler.sendPriorityMessage(msg); // mServiceHandler.sendMessage(msg); } }
- 和其他服务:
public class LocationManagerIntentService extends PriorityIntentService { @Override protected void onHandleIntent(Intent intent) { intentFinished(); } }