日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

从源码出发深入理解 Android Service

發布時間:2025/3/15 Android 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 从源码出发深入理解 Android Service 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

0X00 Service 基礎知識

Service 作為 Android 提供的四大組件之一,主要負責一些沒有前臺顯示的后臺任務。即使應用本身不再可見,Service 的屬性也能使得其在后臺運行。除此之外,Service 也可以通過 Binder 機制,與界面甚至其他應用進行進程間通信,以實現相應的交互。這里需要簡單說明的是,既然是后臺任務,為什么不選用 Thread 了?選用 Service 和 Thread 的主要區別在于需不需要在應用不可見的時候依然保留。舉例來說,新聞詳情頁面的數據請求,只用在當前頁面生效,而音樂播放這些后臺任務就可以通過 Service 的方式來實現。

關于如何使用 Service,官方教程已經說明得足夠詳細了,如果對這些用法,還有不清晰的地方,請戳這里進行查看,->?官方教程。官方教程里面包括,startService 和 bindService 的區別,在不同場景下應該選用哪種 Service 實現方式。


0X01 startService 調用流程

從前面的教程里面,可以知道 Service 的啟動一般有兩種方式,分別是 bindService 和 startService。這里主要說明 startService, 具體的實現邏輯在 ContextImpl 中,我們看看源碼是怎么實現的。

@Override public ComponentName startService(Intent service) {warnIfCallingFromSystemProcess();return startServiceCommon(service, mUser); }

接下來,看看方法內部具體是怎么實現的。

private ComponentName startServiceCommon(Intent service, UserHandle user) {try {validateServiceIntent(service);service.prepareToLeaveProcess();ComponentName cn = ActivityManagerNative.getDefault().startService(mMainThread.getApplicationThread(), service, service.resolveTypeIfNeeded(getContentResolver()), getOpPackageName(), user.getIdentifier());// ignore some codes...return cn;} catch (RemoteException e) {throw new RuntimeException("Failure from system", e);} }

從上面的代碼可以看到,這里是通過 ActivityManagerNative 來執行的。如果看過我的另一篇文章,Android Activity 生命周期是如何實現的, 可能會覺得很熟悉。事實上這里采用的機制就是同樣的。

private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {protected IActivityManager create() {IBinder b = ServiceManager.getService("activity");if (false) {Log.v("ActivityManager", "default service binder = " + b);}IActivityManager am = asInterface(b);if (false) {Log.v("ActivityManager", "default service = " + am);}return am;} };

ActivityManagerNative 的 getDefault 方法是這么實現的。可以看到,gDefault 是類型為 IActivityManager 的 Binder 對象。而這個 Binder 對象可以看做是在 System Server 中的 ActivityManagerService 的句柄,通過這個 Binder 對象,可以跨進程調用 ActivityManagerService。

如果上述內容不容易理解的話,我們可以類比地來看這個問題。我們遙控電視的時候,例如進行增加音量的操作,這個操作實際不是由遙控器完成的,而是電視中的電子元件完成的。遙控器會和電視進行協商,先聲明有哪些操作可以執行,然后將這些協商后的操作在遙控器端和電視端

總結

以上是生活随笔為你收集整理的从源码出发深入理解 Android Service的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。