Android Service 形式分类
(一)由SystemService和SystemServiceManager控制
SystemService作為一個運行在SystemServer的基類,為用戶需要實現的service提供了一套生命周期,就跟Activity類似的一套周期,需要用戶override部分生命周期函數來保證正常工作
onStart():讓service跑起來,跑起來之后需要調用publishBinderService將service注冊到ServiceManager(本質上就是通知servicemanager來add這樣一個service)
onBootPhase(int):這個函數應該是systemserver在啟動的時候會多次調用,參數代表當前啟動進行到了什么階段,用戶定義的service針對各個階段需要做怎樣的處理或者是不做任何處理
例子:mount service中,當phase處于PHASE_ACTIVITY_MANAGER_READY,也就是Activitymanager準備就緒之后,mount service就要做這步操作
@Overridepublic void onBootPhase(int phase) {if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {mMountService.systemReady();}}這類繼承了SystemService的類,很容易能夠被管理起來,又聲明周期來進行控制
但是針對以前設計的Service,例如很多Service并非繼承自SystemService的,而是繼承自各類interface的。這種service就在內部定義了一個靜態內部類,LifeCycle繼承子SystemService,來輔助完成控制。
如MountService中就定義了一個這樣的靜態內部類
public static class Lifecycle extends SystemService {private MountService mMountService;public Lifecycle(Context context) {super(context);}@Overridepublic void onStart() {mMountService = new MountService(getContext());publishBinderService("mount", mMountService);}@Overridepublic void onBootPhase(int phase) {if (phase == SystemService.PHASE_ACTIVITY_MANAGER_READY) {mMountService.systemReady();}}@Overridepublic void onStartUser(int userHandle) {mMountService.onStartUser(userHandle);}@Overridepublic void onCleanupUser(int userHandle) {mMountService.onCleanupUser(userHandle);}} SystemServer中啟動MountService的時候 private static final String MOUNT_SERVICE_CLASS ="com.android.server.MountService$Lifecycle"; ...... mSystemServiceManager.startService(MOUNT_SERVICE_CLASS);首先定義了一個內部類的字符串,利用反射來加載這個類
public SystemService startService(String className) {final Class<SystemService> serviceClass;try {serviceClass = (Class<SystemService>)Class.forName(className);} catch (ClassNotFoundException ex) { ......}return startService(serviceClass);}啟動這個類
public <T extends SystemService> T startService(Class<T> serviceClass) { Constructor<T> constructor = serviceClass.getConstructor(Context.class);service = constructor.newInstance(mContext); ...... mServices.add(service); ...... service.onStart(); ...... }這里就調用了SystemService的生命周期,將service啟動起來了
(二)第二類Service,就僅僅實現了要提供給外面的接口,不涉及生命周期的管束。
PackageManagerService就是這類,SystemServer都是去顯示調用它的主要生命函數,例如main等
走形式上service大概就這兩類吧,以后遇到新的就再補充@.@
原文地址:?https://zhuanlan.zhihu.com/p/20510083
總結
以上是生活随笔為你收集整理的Android Service 形式分类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ActivityManagerServi
- 下一篇: Android Telephony分析(