Android 基礎知識:四大組件之 Service詳解

 

 

  • 可以在後臺執行長時間運行操作而沒有用戶界面的應用組件
  • 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的問題

  • 區別

 

今年年初我花一個月的時間收錄整理了一套知識體系,如果有想法深入的系統化的去學習的,可以私信我【安卓】,我會把我收錄整理的資料都送給大家,幫助大家更快的進階。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章