2012-03-02 82 views
13

對於startService狀態,doco「如果此服務尚未運行,它將被實例化並啓動(如果需要,將爲它創建一個進程);如果它正在運行,則它仍然在運行。 我發現每次調用startService似乎都開始了單獨的服務實例,因爲服務正在執行的工作(在我的測試用例中,簡單地寫入新的日誌文件)正在再次完成爲每個電話。 我試圖通過循環ActivityManager ... getRunningServices(Integer.MAX_VALUE)來檢測服務,但它沒有顯示出來。 Android 2.3.3上SGS 11 我很想念這裏的東西。我知道服務的onCreate()方法只在被創建時被調用,並且由於我有一個連續的進程在服務中運行(在我的Activity的onResume方法中,我啓動服務(「myService」)用:阻止Android服務的多個副本

Intent intent = new Intent(this, myService.class); 
startService(intent); 

在爲MyService我有一個像的onCreate

@Override 

public void onCreate(){ 
    super.onCreate(); 
    ... 

從哪裏設置一個定時器,用一個TimerTask,其寫入日誌文件一次/第二

。 0

這按預期工作 - 我可以看到正在寫入的日誌。 在活動的的onResume方法,調用StartService方法之前,我檢查,看是否通過調用包含

for (RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) { 
    if (service.service.getClassName().contentEquals("com.gpsanimator.startrax.myService")) { 
    Toast.makeText(getApplicationContext(), "Service IS SO running: ", Toast.LENGTH_SHORT).show(); 
     return true; 
} 

一個checkForRunningService法這種從未發現爲myService服務中存在爲myService服務,儘管這似乎是因爲它正在愉快地寫入日誌文件。

每次我恢復我的Activity時,我的myService服務的onCreate方法被調用 - 它會生成一個新的日誌文件並開始寫入它以及不斷更新的原始日誌文件。 第一次調用startService時服務是否啓動?然後繼續運行?不應該對startService()的後續調用找到已經運行的服務,因此不會再次觸發onCreate()方法?但那不是我所看到的。似乎每次調用startService()都會觸發Service的onCreate()方法。

這顯然比這更復雜,我想深究其中。

+0

不要去讀所有的答案。正如下面提到的StartTrax,當他擴展「IntentService」而不是「Service」類時發生了這種情況。 「問題是我宣佈我的myService類擴展IntentService,而不是Service!一旦我解決了這個問題,它就按照本書一樣工作! – Noundla 2015-12-17 12:30:56

回答

9

問題是我宣佈我的myService類擴展IntentService,而不是服務! 一旦我解決了這個問題,一切都按照本書的原則進行!

+1

太好了。你能接受你自己的答案嗎?這將有助於其他人提出建議。 – 2013-08-30 17:14:15

27

這一切都取決於你把代碼中的哪一種方法。

當你調用startService只有一個服務將是創建在給定時間。如果服務已經存在,它將被重用。所以onCreate()中的代碼只有在服務不存在的情況下才會被調用。

但是,每次調用startService時,無論如何都會運行onStartCommand()中的代碼。

因此,只有一個服務的實例在給定的時間存在,但調用startService可能會產生影響。

+0

好吧,它變得更清晰了,謝謝,但我的問題的第二部分仍未得到答覆 - 爲什麼服務不會出現在getRunningServices中。 – StarTraX 2012-03-02 05:23:44

+0

@StarTraX你能分享一些代碼嗎?也許你正在停止服務? – yydl 2012-03-02 07:07:43

+0

我在上面的原始文章中添加了一些代碼示例。 – StarTraX 2012-03-04 04:51:44

0

您正在擴展IntentService,它將作爲工作線程工作。服務根據需要啓動,然後使用工作線程處理每個Intent,並在工作完成時自行停止。因此,在您的情況下,您的服務在完成任務後自行停止,以便創建多次。您應該使用Service類並與該組件綁定。

1

IntentService立即停止(自動)執行下班後,但如果你直到工作完成後,你被重用現有服務實例的onCreate不叫再次啓動它。所以請小心使用IntentServices。