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