2016-11-05 27 views
1

我有一個執行CRUD操作的IntentService。當我的應用程序開始更新數據時,我開始了IntentService,當數據更新時,我需要啓動顯示數據的Activity您能否向我解釋IntentService的工作原理

但是正如我現在看到的,IntentService在一個單獨的進程中啓動我的代碼,在我的活動被創建後完成,所以我有空的活動。我能解決這個問題嗎?或者標準Service是唯一的方法?

@Override 
    protected void onHandleIntent(Intent intent) { 
     Log.e("action",intent.getStringExtra(Utils.INTENT_SERVICE_INVOKE)); 
     ResultReceiver resultReceiver = intent.getParcelableExtra(Utils.RECEIVER); 
     switch (intent.getStringExtra(Utils.INTENT_SERVICE_INVOKE)){ 
      case Utils.LOAD_All_DATA:{ 
       loadActivities(); 
       loadPersons(); 
       loadPictureData(); 
       Log.e("order","forth"); 
       resultReceiver.send(Utils.TASK_FINISHED,new Bundle()); 
//    Intent broadcastIntent = new Intent(); 
//    broadcastIntent.setAction(Utils.LOAD_All_DATA); 
//    sendBroadcast(broadcastIntent); 
       break; 
      } 
      case Utils.READ_ACTIONS_DATA:{ 
       readActionData(); 
       break; 
      } 
      case Utils.READ_PERSONS_DATA:{ 
       readPersonsData(); 
       break; 
      } 
      case Utils.READ_ACTION_BY_ID:{ 
       readActionDataById(intent); 
       break; 
      } 
     } 
    } 
+0

您是否閱讀過文檔?它在這裏:https://developer.android.com/reference/android/app/IntentService.html – Christine

+0

@Christine是的,我沒有,我的問題沒有答案。 – Turbozanik

+0

該文檔有一段關於發送通知的段落,這是啓動一個Activity來檢索IntentService創建的結果的一種方式,它也有一個關於回調的段落,這就是如果您的應用程序處於活動狀態,服務將如何報告給Activity 。如果您的應用不在前臺,則生成通知是一種方法。 – Christine

回答

1

IntentService默認情況下不在單獨的進程中啓動。這是一個普通的Service,增加了將工作執行委託給單個後臺線程的邏輯,並在處理完所有傳入的Intents後停止服務。

你要做到以下幾點:

  1. 從Web服務器
  2. 進行數據更新通知,一旦更新完成
  3. Activity

您的選項獲得一個參考更新的數據(從我的頭頂開始):

  1. 使用可以啓動和綁定的標準android Service。需要更新時啓動此Service,更新完成時發送通知並綁定ServiceActivity以獲取數據。
  2. 實現一些內存中緩存,該緩存既不與IntentService綁定,也不與Activity綁定。例如:執行DataManager類並將其實例化爲ApplicationIntentServiceActivity都可以獲得對Application的引用,因此他們將能夠獲得對DataManager對象的引用。 IntentService會將數據寫入它,Activity將在稍後讀取此數據
  3. 實現數據緩存SQLite。這種方法與上面的#2非常相似,但是數據並不存儲在內存中,而是寫入SQLite數據庫。

上述三個選項中最簡單的是#2。此外,如果你使用#2,那麼如果出現這種需求(這對於「數據量大」的應用程序來說是最好的),那麼遷移到#3會相對容易。

+0

Thx,我想我試圖去服務解決方案(之前使用它),我扭曲了過程字的價值,我正在談論線程,斯里。可悲的是,我們不能真正從IntentService獲得某種task_finished回調,如果它們被實現了,它將會是非常棒的工具。 – Turbozanik

+0

@Turbozanik,您可以使用事件總線來執行應用程序中的組件之間的通信。我最喜歡的活動巴士是綠色機器人的活動巴士。使用這些工具,您可以輕鬆地將事件從「服務」傳遞到「活動」,「碎片」,「應用程序」等。 – Vasiliy

+0

我正在使用ResultReceiver,但是關於綠色機器人的文章。謝謝。 – Turbozanik

相關問題