2017-06-25 272 views
0

我對Android開發非常陌生,我也沒有真正瞭解IntentServices的工作方式。這是我到目前爲止有:在後臺運行服務

class TimerActivity : AppCompatActivity() { 

    override fun onCreate(savedInstanceState: Bundle?) { 
     super.onCreate(savedInstanceState) 
     setContentView(R.layout.activity_timer) 

     findViewById(R.id.startBtn).setOnClickListener { 
      startService(Intent([email protected], TimerService::class.java)) 
     } 

     findViewById(R.id.stopBtn).setOnClickListener { 
      stopService(Intent([email protected], TimerService::class.java)) 
     } 
    } 
} 

class TimerService : IntentService("TimerService") { 

    override fun onCreate(){ 
     super.onCreate() 
     toast("Started activity") 
    } 

    override fun onDestroy(){ 
     super.onDestroy() 
     toast("Stopped activity") 
    } 

    override fun onHandleIntent(intent: Intent?) { 

    } 
} 

我試圖啓動一個按鈕的點擊背景的活動,並停止它的另一個的點擊。但是爲什麼onDestroy()會在onCreate()之後立即被觸發,而我沒有點擊停止按鈕?

謝謝

+0

也許是因爲你有空的'onHandleIntent' –

+0

當onHandleIntent()完成其工作時,Intent服務會自行停止。 –

回答

1

這就是IntentService的工作原理。

IntentService是一個服務的基類,用於按需處理異步請求(表示爲Intents)。 [...]

IntentService將收到Intents,啓動工作線程,並根據需要停止服務。

所有請求都在單個工作線程上處理 - 它們可能需要的時間(並且不會阻塞應用程序的主循環),但一次只能處理一個請求。

只要有任務要處理,服務就會一直存在。之後,服務將結束並重新開始下一個任務。

如果你想有一個running service,甚至可能是bound service,你必須直接繼承Service和照顧絲扣

注意:服務在同一個進程中的應用程序運行它是在默認情況下聲明的並且在該應用程序的主線程中。如果您的服務在用戶與來自同一應用程序的活動進行交互時執行密集或阻止操作,則該服務會降低活動性能。爲了避免影響應用程序性能,請在服務中啓動一個新線程。

和終身

注意:爲了避免浪費系統資源和消耗電池電量,確保您的應用程序停止其服務時,它的完成工作。如有必要,其他組件可以致電stopService()停止服務。即使您爲服務啓用了綁定,但如果您收到onStartCommand()的電話,則必須始終自行停止該服務。

+0

謝謝,服務是我所需要的。我試圖每隔幾秒使用Timer()。schedule()在onStartCommand()內返回START_STICKY之前調用Toast方法。但它只是崩潰(我猜是因爲無限循環)。但是我怎樣才能達到這個效果呢? – OhMad

+0

Logcat爲您提供了錯誤。你不必假設崩潰的原因。 – tynn