2012-06-04 60 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