2

我想从 Activity 启动服务。

首先,我使用 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。

4

1 回答 1

0

您的问题有点令人困惑,因为服务已经独立于活动而存在。但是请注意,服务默认在主线程中运行。如果你想在不同的线程中运行服务(在这种情况下看起来就像你做的那样),你必须设置一个 Messenger 对象并在你的工作线程和你的 UI 线程之间发送消息。您还可以考虑使用 AIDL(无论如何,Messenger 都是在此之上构建的)。如果您不使用 Messenger,您的交流可能会使用意图。如果是这种情况,您应该查看IntentService。但是,这仅在您向服务发送消息时有效,而不是来回发送。如果您想要来回通信,则必须使用某种 Messenger 或类似模式。

顺便说一句,将 IntentService 用于“停止”和“开始”之类的事情是很常见的。通常还有一个后台线程,它使用 Messenger 或类似的东西与 Service 通信,然后发送/接收消息以指示工作线程应该做什么。

您可能还会研究 AsyncTask,因为它使这种事情变得更加简单。

于 2012-06-05T01:06:24.077 回答