簡體   English   中英

從活動開始服務並等待其准備就緒

[英]start service from activity and wait until its ready

我想從活動中啟動服務。

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

您的問題有點令人困惑,因為服務已經獨立於活動運行了。 但是請注意,默認情況下,服務在主線程中運行。 如果要在其他線程中運行服務(在這種情況下看起來像您一樣),則必須設置Messenger對象,並在工作線程和UI線程之間發送消息。 您還可以研究使用AIDL(無論如何實際上都是在Messenger之上構建的)。 如果您不使用Messenger,則您的通信可以使用意圖。 在這種情況下,您應該查看IntentService 但是,這僅在您向服務發送消息時有效 ,而不能來回發送。 如果要來回通信,則必須使用某種Messenger或類似的模式。

順便說一句,使用IntentService處理“停止”和“啟動”之類的事情很普遍。 通常,還有一個后台線程,該后台線程使用Messenger或類似工具與服務進行通信,然后發送/接收消息以指示工作線程應執行的操作。

您可能還會研究AsyncTask,因為它使這種事情變得更加簡單。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM