从源码出发深入理解 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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ANDROID STUDIO详细教程汇总
- 下一篇: Android动态加载技术三个关键问题详