2012-06-04 92 views
1

我想从活动开始服务。从活动开始服务并等待其准备就绪

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

你的问题有点令人困惑,因为服务已经独立于活动而生活。但是请注意,服务默认在主线程中运行。如果你想在不同的线程中运行服务(在这种情况下看起来像你),你将不得不建立一个Messenger对象并在你的工作线程和UI线程之间发送消息。你也可以看看使用AIDL(无论如何,Messenger是真正建立的)。你的沟通,如果你不使用Messenger,可以使用意图。如果是这种情况,你应该看看IntentService。但是,这只适用于当您发送消息服务时,不能来回。如果你想来回通信,你将不得不使用某种Messenger或类似的模式。

顺便说一句,使用IntentService来处理像'stop'和'start'这样的事情很常见。通常还有一个后台线程,它使用Messenger或类似的东西与服务进行通信,然后发送/接收消息以指示工作线程应该执行什么操作。

你也可以看看AsyncTask,因为它使这种事情变得更简单。

+0

我尝试了一个IntentService,但它仍然不起作用。然后我切换到一个成功的AsyncTask。但在我的情况下,我发现,我不需要异步。执行。服务/ AsyncTask应记录一些传感器数据。在调试模式下,我看到,''onSensorChanged()''方法是由主/ UI线程调用的。我的假设是,它不会被主线程调用。 – timaschew