轉載來之 鴻洋
和 Hensen_
Hensen_的博客地址:
http://blog.csdn.net/qq_30379689
這篇包含了:
Service后臺服務、前臺服務、IntentService、跨進程服務、無障礙服務、系統服務 幾乎所有Android Service相關的東西。
1
前言
作為四大組件之一的Service類,是面試和筆試的必備關卡,我把我所學到的東西總結了一遍,相信你看了之后你會對Service娓娓道來,在以后遇到Service的問題胸有成竹,廢話不多說,開車啦
Service是Android中實現程序后臺運行的解決方案,它非常適用于去執行那些不需要和用戶交互而且還要求長期運行的任務。Service默認并不會運行在子線程中,它也不運行在一個獨立的進程中,它同樣執行在UI線程中,因此,不要在Service中執行耗時的操作,除非你在Service中創建了子線程來完成耗時操作
Service的運行不依賴于任何用戶界面,即使程序被切換到后臺或者用戶打開另一個應用程序,Service仍然能夠保持正常運行,這也正是Service的使用場景。當某個應用程序進程被殺掉時,所有依賴于該進程的Service也會停止運行
2
后臺服務
后臺服務可交互性主要是體現在不同的啟動服務方式,startService()和bindService()。bindService()可以返回一個代理對象,可調用Service中的方法和獲取返回結果等操作,而startService()不行
不可交互的后臺服務
不可交互的后臺服務即是普通的Service,Service的生命周期很簡單,分別為onCreate、onStartCommand、onDestroy這三個。當我們startService()的時候,首次創建Service會回調onCreate()方法,然后回調onStartCommand()方法,再次startService()的時候,就只會執行一次onStartCommand()。服務一旦開啟后,我們就需要通過stopService()方法或者stopSelf()方法,就能把服務關閉,這時就會回調onDestroy()
一、創建服務類
創建一個服務非常簡單,只要繼承Service,并實現onBind()方法
二、配置服務
Service也是四大組件之一,所以必須在manifests中配置
<service android:name=".Service.BackGroupService"/>
三、啟動服務和停止服務
我們通過兩個按鈕分別演示啟動服務和停止服務,通過startService()開啟服務,通過stopService()停止服務
當你開啟服務后,還有一種方法可以關閉服務,在設置中,通過應用->找到自己應用->停止
運行程序后,我們點擊開始服務,然后一段時間后關閉服務。我們以Log信息來驗證普通Service的生命周期:onCreate->onStartCommand->onDestroy
其中你會發現我們的子線程進行的耗時操作是一直存在的,而我們Service已經被關閉了,關閉該子線程的方法需要直接通過Home鍵關閉該應用程序
3
可交互的后臺服務
可交互的后臺服務是指前臺頁面可以調用后臺服務的方法,可交互的后臺服務實現步驟是和不可交互的后臺服務實現步驟是一樣的,區別在于啟動的方式和獲得Service的代理對象
一、創建服務類
和普通Service不同在于這里返回一個代理對象,返回給前臺進行獲取,即前臺可以獲取該代理對象執行后臺服務的方法
二、綁定服務和解除綁定服務
我們通過兩個按鈕分別演示綁定服務和解除綁定服務,通過bindService()開啟服務,通過unbindService()停止服務
這里和startService的區別在于多了一個ServiceConnection對象,該對象是用戶綁定后臺服務后,可獲取后臺服務代理對象的回調,我們可以通過該回調,拿到后臺服務的代理對象,并調用后臺服務定義的方法,也就實現了后臺服務和前臺的交互
三、運行代碼
運行程序后,我們點擊綁定服務,然后一段時間后解除綁定服務。我們以Log信息來驗證Service的生命周期:onCreate->onBind->onUnBind->onDestroy,其中也可以看到我們調用后臺服務的方法showToast和showList
15408-15408/com.handsome.boke2 E/Service: onCreate15408-15408/com.handsome.boke2 E/Service: onBind15408-15408/com.handsome.boke2 E/Service: showToast15408-15408/com.handsome.boke2 E/Service: showList15408-15408/com.handsome.boke2 E/Service: onUnbind15408-15408/com.handsome.boke2 E/Service: onDestroy
混合性交互的后臺服務
或許你會迷惑,startService和bindService之間有什么關系?其實簡單的說兩者之間是沒有關聯的,類似于你親媽生了個雙胞胎一樣,只有純粹的血緣關系。那么問題來了,這兩個啟動方式是否可以同時使用呢,答案是可以的
將上面兩種啟動方式結合起來就是混合性交互的后臺服務了,即可以單獨運行后臺服務,也可以運行后臺服務中提供的方法,其完整的生命周期是:onCreate->onStartCommand->onBind->onUnBind->onDestroy
4
前臺服務
由于后臺服務優先級相對比較低,當系統出現內存不足的情況下,它就有可能會被回收掉,所以前臺服務就是來彌補這個缺點的,它可以一直保持運行狀態而不被系統回收。例如:墨跡天氣在狀態欄中的天氣預報
一、創建服務類
前臺服務創建很簡單,其實就在Service的基礎上創建一個Notification,然后使用Service的startForeground()方法即可啟動為前臺服務
啟動前臺服務
startService(new Intent(this, ForegroundService.class));
二、運行代碼
我們可以看到狀態欄確實增加了我們這條通知
當我們將該程序退出并殺掉的時候,通過設置->應用->選擇正在運行中的應用,我們可以發現,我們的程序退出殺掉了,而服務還在進行著
5
IntentService
IntentService是專門用來解決Service中不能執行耗時操作這一問題的,創建一個IntentService也很簡單,只要繼承IntentService并覆寫onHandlerIntent函數,在該函數中就可以執行耗時操作了
6
AIDL跨進程服務
關于AIDL跨進程服務的使用和原理分析,可以見我另一篇博客:Android基礎——初學者必知的AIDL在應用層上的Binder機制
http://blog.csdn.net/qq_30379689/article/details/52253413
7
AccessibilityService無障礙服務
關于AccessibilityService無障礙服務的使用和實例,可以見我另一篇博客:Android進階——學習AccessibilityService實現微信搶紅包插件
http://blog.csdn.net/qq_30379689/article/details/53242953
8
系統服務
系統服務提供了很多便捷服務,可以查詢Wifi、網絡狀態、查詢電量、查詢音量、查詢包名、查詢Application信息等等等相關多的服務,具體大家可以自信查詢文檔,這里舉例幾個常見的服務
判斷Wifi是否開啟
WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);boolean enabled = wm.isWifiEnabled();獲取系統最大音量
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);int max = am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);獲取當前音量
AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);int current = am.getStreamMaxVolume(AudioManager.STREAM_RING);判斷網絡是否有連接
ConnectivityManager cm = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);NetworkInfo info = cm.getActiveNetworkInfo();boolean isAvailable = info.isAvailable();