首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Android Service 與 Thread 生命週期:為何應用退出服務仍在後台運行?

     編輯:程式設計疑難解答

問題一:Service 是否與應用在同一進程?

預設情況下,Service 與 Activity 運行在同一進程(主進程)。但 Service 可以透過 android:process 屬性指定獨立進程:

<service android:name=".MyService" android:process=":remote" />

即使同進程,Service 的生命週期獨立於 Activity。使用者關閉所有 Activity(按返回鍵或滑動關閉),進程不會立即銷毀,只要有 Service 處於 START_STICKY 或綁定狀態,系統會保留進程。

問題二:子執行緒在應用退出後是否會被銷毀?

  • 一般情況:系統會等待執行緒正常結束(run() 返回)後才回收資源。執行緒若持有鎖、檔案描述符、網路連線等資源,強制終止會導致資源洩漏或資料損壞。
  • Daemon 執行緒:thread.setDaemon(true) 標記為守護執行緒,當所有非守護執行緒結束時,JVM/ART 會直接終止守護執行緒,不等待其完成。
  • Android 特有:主執行緒(UI 執行緒)結束意味著進程結束,所有子執行緒隨之終止。但若 Service 仍在運行,進程存活,子執行緒得以繼續。

關鍵差異表

項目ActivityServiceThread
生命週期控制系統回調startService / bindServicestart() / run() 結束
預設進程主進程主進程(可指定獨立)所屬進程
應用「退出」影響onDestroy → 進程可能存活不受直接影響進程結束時強制終止
長時間任務適合度低(易被回收)高(前台服務更穩)需自行管理生命週期

最佳實踐

  1. 長時間下載/播放/同步:使用 Foreground Service(顯示通知),系統極少殺死。
  2. 周期性工作:採用 WorkManager(API 23+)或 JobScheduler,系統自動調度、省電。
  3. 執行緒池:避免手動 new Thread(),使用 Executors / ThreadPoolExecutor 統一管理,配合 Future.cancel() 優雅停止。
  4. 資源清理:在 onDestroy() 或 finally 區塊釋放鎖、關閉流、取消網路請求。

總結

Service 不會因 Activity 關閉而自動停止,除非呼叫 stopService() 或 stopSelf()。子執行緒在進程存活期間持續運行,進程結束時由系統強制回收。正確架構應將長期任務交給 Service/WorkManager,並妥善管理執行緒生命週期與資源釋放。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved