我想从活动中启动服务。
首先我尝试使用LocalBinder。这可行,但服务绑定到活动。我不想在活动消失时停止服务。我找不到LocalBinder的解决方案,所以我删除了它并尝试了这个:
在服务中使用单例实例 在新线程中调用startService方法并等待实例可用:
final Intent recordService = new Intent(RecordActivity.this, RecordService.class);
Runnable r = new Runnable() {
@Override
public void run() {
startService(recordService);
}
};
new Thread(r).start();
Log.i(MMLF.T, "service instance: "+serviceInstance);
final ProgressDialog mProgressDialog = ProgressDialog.show(
RecordActivity.this, "Waiting", "wait until record service is loaded",
true);
while (serviceInstance == null) {
serviceInstance = RecordService.get();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
Log.e(MMLF.T, "could not sleep", e);
}
}
mProgressDialog.dismiss();
但这也行不通。它停留在等待循环中。如果我删除了这个等待的东西并且新的new Thread(r).start()
行是最后一行,那么活动和服务就可以了。
如何独立于某项活动启动服务?我也让他们互相沟通。活动应调用两种方法(开始和停止录制),服务应发送消息。对于第二个,我可以使用LocalBroadcast。
答案 0 :(得分:0)
您的问题有点令人困惑,因为服务已经独立于活动。但请注意,默认情况下,服务在主线程中运行。如果要在不同的线程中运行服务(在这种情况下看起来就像这样),则必须设置Messenger对象并在工作线程和UI线程之间发送消息。您还可以考虑使用AIDL(无论如何,最好构建Messenger)。如果您不使用Messenger,您的通信可以使用意图。如果是这种情况,您应该查看IntentService。但是,这仅在您将消息发送到服务时才有效,而不是来回。如果你想来回沟通,你将不得不使用某种Messenger或类似的模式。
顺便说一句,对'stop'和'start'之类的东西使用IntentService是很常见的。通常还有一个后台线程,它使用Messenger或类似的东西与服务进行通信,然后发送/接收消息以指示工作者线程应该做什么。
您也可以查看AsyncTask,因为它使这种事情变得更加简单。