2014-01-29 22 views
0

有關服務的Android文檔說:「另一個應用程序組件可以啓動服務,即使用戶切換到另一個應用程序,它也將繼續在後臺運行。」從onStopCommand返回結束Android服務嗎?

讓我們假設Android的服務產生一個線程或在的AsyncTask onStartCommand:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
//asyncrhonous call-1 
new SomeAsyncTask().execute(); 
//asynchronous call-2 
new Thread(new Runnable(){//some runnable}).start(); 
//shouldn't service terminate here? 
return Service.START_NOT_STICKY; 
} 

在上面的代碼中,onStartCommand return語句立即因爲兩個語句之前,它是異步的遭遇。在這裏產生的線程結束執行之前,服務是否應該終止?如果他們不是守護進程呢?

此外,由於在UI線程上執行的服務(對IntentService稍有困惑),我們需要在單獨的線程中執行網絡操作。因此,人們可能經常需要創建asynctasks或不同的線程。任何人都可以幫助我理解服務的執行情況,以及服務是否「繼續在後臺運行」?然後,從onStartCommand返回後,它「運行」了什麼?

回答

2

所以我懷疑是不是應該在服務終止線程催生了這裏就結束了自己的執行

onStopCommand()返回並不表示該服務被銷燬。

如果一個服務「繼續在後臺運行」,那麼從onStartCommand返回後,它是什麼「運行」?

沒有,默認情況下。它只是坐在那裏,佔用記憶,對使用者造成一般性的傷害。

如果您啓動一項服務,您需要明確規劃該服務停止的時間和方式。服務停止,或者本身呼叫stopSelf()或其他人呼叫stopService()

+0

「服務停止或者通過自己調用stopSelf()或其他人調用stopService()。」以這種方式停止它會終止正在運行的非守護進程線程嗎? – rahulserver

+0

@rahulserver:這取決於誰是「它」。由Android框架代碼創建的線程是Android框架代碼的責任,所以當IntentService停止時,由IntentService創建的後臺線程將被停止。由* you *創建的線程是您的*責任 - Android的框架代碼不知道任何關於它們的內容。 – CommonsWare

+0

「由IntentService創建的後臺線程」這是否意味着我們已經「明確」編寫在IntentService生命週期方法中的一個線程或由android os(工作線程)隱式創建的線程? – rahulserver