Service官方直譯深入理解(基礎知識完)
Service
被設計為不和使用者直接互動,在後臺執行長期操作的一種系統元件,也可被其它應用使用。每一個服務必須在AndroidManifest中宣告。服務可以通過Context.startService() and Context.bindService().啟動。Note:service執行在主執行緒,因此執行網路操作需要另起執行緒,但IntentService可以解決這個問題。
What is a Service?
首先,我們來說說服務不是什麼:
1:服務不是一個單獨的程式,通常情況下它執行在應用程式的一部分
2.服務不是執行緒,它不能在應用無響應時工作
下面來說說服務兩個主要的特徵:
1.很方便的通知系統,我有一些後臺任務需要處理,直到明確停止服務
2.很方便的給其它應用提供功能
Note:因為服務很簡單,所以我們可以以任何我們想互動的方式來設計一個服務。我們可以將服務看成一個可以隨時呼叫它方法的普通的Java物件,通過AIDL來互動。
Service Lifecycle
服務可以通過兩種方式啟動。如果有人呼叫了Context.startService(),那麼服務的oncreate()和onStartCommand(Intent, int, int)會被回撥,不管執行多少次startService,服務都不會重新建立,而會多次呼叫onStartCommand,所以並不存在停止不了服務的情況。服務會持續下去直到Context.stopService() or stopSelf()被呼叫。onStartCommand返回的不同值對應不同的服務需要。
使用者還可以通過Context.bindService()來持有一個服務連線。當服務沒執行的時候將會呼叫oncreate方法,但不會呼叫onStartCommand方法。客戶端會接收到服務onBind(Intent)方法回撥的IBinder物件,允許客戶端回撥服務裡面的方法。通常情況下,IBinder是由複雜的介面建立的。
上述兩種啟動方式可以同時存在
Permissions
當一個服務在清單檔案中宣告,全域性訪問它將會拒絕。這時需要在自己的清單檔案中宣告合適的許可權來啟動,停止和繫結特定的服務。以Android 2.3為例,當呼叫Context.startService(Intent),我們也需要設定Intent.FLAG_GRANT_READ_URI_PERMISSION and/or Intent.FLAG_GRANT_WRITE_URI_PERMISSION。
這會暫時同意Service訪問Intent指定的Uri,直到服務停止。這個對Service沒有exported也同樣適用。
Process Lifecycle
Android系統會盡可能長的保留持有service的程式,但是當記憶體不足需要殺掉一些程式時,有如下的優先順序:
1.當前服務正在回撥onCreate(), onStartCommand(), or onDestroy()方法,則視為前臺程式,不會被kill
2.當服務長期執行在後臺時,有極高的可能性被kill
3.我們可以通過startForeground(int, Notification)來設定前臺程式,除非在記憶體極端緊張下,否則不會被殺
Note 有很大的可能,一個正在執行的服務在記憶體不足時會被系統殺掉,但是被殺掉後,系統會稍後試著重啟這個服務。我們可以在onStartCommand()方法用START_FLAG_REDELIVERY回撥一個Intent來繼續執行我們的服務
基礎完
相關文章
- 前端工程基礎知識點–Browserslist (基於官方文件翻譯)前端
- 前端工程基礎知識點--Browserslist (基於官方文件翻譯)前端
- JS基礎知識深入總結JS
- [翻譯] 理解 ECMASCript 6 第一章: 基礎知識
- 深入mysql基礎知識的詳解MySql
- Android知識點回顧之Service基礎Android
- Android基礎知識:Service(3)啟動模式Android模式
- 深入理解 C++ 語法:從基礎知識到高階應用C++
- 計算機基礎知識(自我的理解)計算機
- 基礎知識
- MySQL基礎知識點串講PART04--完結篇MySql
- 直譯器設計模式知識概括設計模式
- Linux下Shell基礎知識深入淺出(轉)Linux
- AI 基礎知識AI
- Webpack 基礎知識Web
- Dart基礎知識Dart
- RabbitMQ基礎知識MQ
- webpack基礎知識Web
- javascript基礎知識JavaScript
- ThinkPHP基礎知識PHP
- Laravel基礎知識Laravel
- Redis基礎知識Redis
- Docker基礎知識Docker
- 程式基礎知識
- Envoy基礎知識
- DockerFile基礎知識Docker
- Nginx基礎知識Nginx
- CSS基礎知識CSS
- Java基礎知識Java
- PRML 基礎知識
- BGP基礎知識
- PHP基礎知識PHP
- React基礎知識React
- httpclient基礎知識HTTPclient
- HBase基礎知識
- Jquery基礎知識jQuery
- js基礎知識JS
- PGA基礎知識