我有android服务,我需要在启动后返回结果。 所以:
1)我启动服务
2)服务做了一些事情
3)服务返回结果
我想也许我可以使用单例类来获取结果。我创建了一个单例类,以使服务将结果保存在其中,然后通过活动从服务中获取结果。这里有类的代码:
public class Result {
//SIGLETON DECLARATION
private static Result mInstance = null;
public static Result getInstance() {
if (mInstance == null) {
mInstance = new Result();
}
return mInstance;
}
private Result() {
}
//CODE
Object result;
boolean resultIsSet = false;
public void deletePreviousResult() {
this.result = null;
resultIsSet = false;
}
public void setResult(Object result) {
Log.w("result", "setResult");
this.result = result;
resultIsSet = true;
}
public Object getResult() {
Log.w("result", "getResult");
while(resultIsSet == false) {}
return this.result;
}
这是我用来获得结果的代码:
public int getInfo() {
Result.getInstance().deletePreviousResult();
//start the service and ask to save the result in singleton class
Intent myIntent = new Intent(mInstanceContext, MediaPlayerService.class);
myIntent.setAction("getInfo");
mInstanceContext.startService(myIntent);
//take the result
return (Integer) Result.getInstance().getResult();
}
onStartCommand
正在做的是:
Result.getInstance().setResult(mMediaPlayer.getCurrentPosition());
其中mMediaPlayer
是MediaPlayer对象。
然而问题是,如果setResult
中也应该调用onStartCommand
,则永远不会调用它!为什么?这是我的做法错了吗?
答案 0 :(得分:1)
您在getInfo()
中的代码:
mInstanceContext.startService(myIntent);
//take the result
return (Integer) Result.getInstance().getResult();
假设您致电startService()
时服务已启动且onStartCommand()
被称为同步,以便在下一个语句中您可以使用Result.getInstance().getResult()
获取结果
不幸的是,它不会那样工作。调用startService()
与调用对象上的方法不同。当您致电startService()
时,您所做的就是告诉Android您希望该服务在下一个可用时刻启动 。由于您的服务中的onStartCommand()
需要在主线程上调用,通常这意味着Android将启动您的服务,并在下次Android获得对主线程的控制时调用onStartCommand()
(即:所有活动方法都已退回)。在任何情况下,您都无法确定何时启动服务或何时调用onStartCommand()
。这是异步调用,因此您需要依赖回调机制。这意味着您需要编写某种回调方法,该服务可以在完成工作后调用,并希望将结果返回给您。
有多种方法可以做到这一点。您可以让服务向您的活动发送意图。您可以让服务广播与结果的Intent。您可以绑定到服务并注册回调侦听器(请参阅开发人员文档以获取绑定服务)。可能还有其他方法。