我有意向具體活動流程在沒有得到傳遞到IntentService
問題理解:這是情景:安卓:使用一個IntentService與多個動作
- 考慮3個活動,家庭,B和C C有2個片段CF1和CF2。
- B,CF1和CF2使用相同的IntentService類,但具有不同的操作。
- IntentService開始使用
startService(Intent)
。 (getActivity()。startService(Intent)for Fragments) - IntentService開始的任何地方,如果它在Activity/Fragment的
onStop()
中運行,我確保它使用stopService(intent)
停止。 - 如果活動流程是Home - > C - > CF1 - > CF2,則一切正常。
- 如果活動流程是Home→B→C→CF1→CF2,那麼
onHandleIntent
永遠不會在來自CF2的startService(Intent)之後被調用。 B和CF1意圖被處理。對於調試,我嘗試通過等待IntentService在Activity B中完成,然後轉到CF1 - > CF2,仍然是同樣的問題。 CF1似乎在開始同樣的意圖服務時似乎沒有任何問題。當我嘗試爲CF2創建一個新的IntentService
類時,它起作用了。
我的理解是IntentService有一個intents隊列。如果服務第一次運行,onStartCommand被調用(我們不應該爲IntentService處理)。如果服務已經運行,那麼每調用一次startService都會調用onHandleIntent。
顯然,我做錯了什麼,但不清楚。我試圖尋找到其他stackoverflow問題,但沒有幫助。我使用的代碼是非常簡單的:
的AndroidManifest.xml
<service android:name=".service.ExampleIntentService" />
活動B
@Override
public void onCreate(Bundle savedInstanceState)
{
.......
intent = new Intent(getApplicationContext(), ExampleIntentService.class);
intent.setAction(StringConstants.ACTION_B);
serviceRunning = true; //set to false in onReceiveResult
startService(intent);
}
@Override
public void onStop()
{
if(serviceRunning && intent != null)
stopService(intent)
}
片段CF1
@Override
public void onResume()
{
super.onResume();
intent = new Intent(getActivity(), ExampleIntentService.class);
intent.setAction(StringConstants.ACTION_CF1);
serviceRunning = true; //set to false in onReceiveResult
startService(intent);
}
@Override
public void onStop()
{
if(serviceRunning && intent != null)
stopService(intent)
}
的代碼是完全的片段一樣,CF2
IntentService不排隊意圖。爲每個入站意圖調用startService;所有呼叫都在服務本地的Looper線程上排隊。在沒有做任何事情的時候停止服務,這是很好的做法,它只是一種優化。我建議你放棄這樣做,直到你的應用程序正常工作 – 2013-02-17 19:27:01
@ G.BlakeMeike我不明白「不排隊意圖」和「調用在本地服務的Looper線程上排隊」之間的區別。我會嘗試調用stopService並查看。但是,創建一個單獨的intentService會更好嗎?我知道這會起作用。編輯:另外我不知道爲什麼我沒有看到與片段CF1相同的問題。 – Prasanna 2013-02-17 19:40:15
不同之處在於意向總是*傳遞給IntentService.startService。 startService方法將調用排入本地隊列,並由另一個線程從中排隊,並作爲調用傳遞給onHandleIntent。他們全部。請參閱下面的Mark的回答:停止調用stopService。 – 2013-02-17 19:49:15