【问题标题】:start service from activity and wait until its ready从活动开始服务并等待它准备好
【发布时间】:2012-06-04 22:45:55
【问题描述】:

我想从一个 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。

【问题讨论】:

    标签: android service asynchronous android-activity


    【解决方案1】:

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

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

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

    【讨论】:

    • 我尝试了一个 IntentService,但它仍然无法正常工作。然后我成功切换到 AsyncTask。但就我而言,我发现我不需要异步。执行。服务/AsyncTask 应该记录一些传感器数据。在调试模式下,我看到,onSensorChanged() 方法由主 / UI 线程调用。我的假设是,它不会被主线程调用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 2019-02-18
    • 1970-01-01
    相关资源
    最近更新 更多