- 可以在後臺執行長時間運行操作而沒有用戶界面的應用組件
- Service 分爲兩種工作狀態,一種是啓動狀態,主要用於執行後臺計算;另一種是綁定狀態,主要用於其他組件和 Service 的交互。
- 對於同一 app 來說,默認情況下 Service 和 Activity 是在同一個線程中的,main Thread (UI Thread)。
一、啓動過程
- 同樣 建議結合源碼去看,這裏給出調用鏈
- 一篇文章看明白 Android Service 啓動過程
1.1 註冊Service
- Service還是運行在主線程當中的,所以如果需要執行一些複雜的邏輯操作,最好在服務的內部手動創建子線程進行處理,否則會出現UI線程被阻塞的問題
1.2 ActivityThread.java
- Service 的啓動
- ContextWrapper
Proxying代理 implementation實現 of Context that simply簡單的 delegates委託 all of its calls to another Context. Can be subclassed to歸爲 modify修改 behavior without changing the original Context.
- ContextImpl
ContextImpl作爲Context的抽象類,實現了所有的方法,我們常見的getResources(),getAssets(),getApplication()等等的具體實現都是在ContextImpl的
- AMP/AMN/AMS AT/ATP/ATN
這塊內容太多,比如可以看看這個 AMP/AMN/AMS AT/ATP/ATN
- Zygote
Zygote 是android系統應用中一個相當重要的進程,其主要功能是執行Android應用程序。在android系統中運行新的應用,需要跟Zygote進程(擁有應用程序運行時所需要的各種元素和條件)結合後才能執行。
Zygote進程運行時,會初始化Dalvik虛擬機,並啓動它。android的應用程序是由java編寫的,不能直接以本地進程的形態運行在linux上,只能運行在Dalvik虛擬機中。並且每個應用程序都運行在各自的虛擬機中,應用程序每次運行都要重新初始化並啓動虛擬機,這就相當耗時。在android中,應用程序運行前,Zygote進程通過共享已運行的虛擬機的代碼與內存信息,縮短應用程序運行所耗費的時間。並且,它會事先將應用程序要使用的android Fromework中的類和資源加載到內存中,並組織形成所用資源的鏈接信息。新運行的 android 應用程序在使用所需要的資源時不必每次重新形成資源的鏈接信息,這樣提高程序運行速度。
在android中,使用Zygote進程的目的?對於手機,爲了是應用程序在有限的資源型有更快的運行響應速度,提高資源利用率和設備使用時間。android使用Zygote來有效的減少系統負擔,提高運行速度。
二、綁定過程
2.1 只使用startService啓動服務的生命週期
- 如果僅僅只是爲了開啓一個後臺任務,那麼可以使用startService方法。
如果想獲取Service中提供的代理對象,那麼必須通過bindService方法,進行綁定服務。 使用場景比如:音樂播放器,第三方支付等。
2.2 只使用BindService綁定服務的生命週期
- Service 的 onRebind(Intent)方法, 如果在 onUnbind() 方法返回 true 的情況下會執行,否則不執行。
2.3 同時使用startService()啓動服務、BindService()綁定服務的生命週期
- 在Activity中可以通過startService和bindService方法啓動Service。
2.4 ActivityThread.java
3、生命週期
2.4 Service 與 Activity 通信
2.5 啓用前臺服務
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
Notification notification = new Notification(icon, text, System.currentTimeMillis()); Intent notificationIntent = new Intent(this, ExampleActivity.class); PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, notificationIntent, 0); notification.setLatestEventInfo(this, title, mmessage, pendingIntent); startForeground(ONGOING_NOTIFICATION_ID, notification);
2.6 IntentService
IntentService是Service的子類,是一個異步的,會自動停止的服務,很好解決了傳統的Service中處理完耗時操作忘記停止並銷燬Service的問題
- 區別
今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【安卓】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。