Android Service的启动过程

Android Service的启动过程

ID:40520968

大小:132.00 KB

页数:11页

时间:2019-08-04

Android Service的启动过程_第1页
Android Service的启动过程_第2页
Android Service的启动过程_第3页
Android Service的启动过程_第4页
Android Service的启动过程_第5页
资源描述:

《Android Service的启动过程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、AndroidService的启动过程刚开始学习Service的时候以为它是一个线程的封装,也可以执行耗时操作。其实不然,Service是运行在主线程的。直接执行耗时操作是会阻塞主线程的。长时间就直接ANR了。我们知道Service可以执行一些后台任务,是后台任务不是耗时的任务,后台和耗时是有区别的喔。这样就很容易想到音乐播放器,天气预报这些应用是要用到Service的。当然如果要在Service中执行耗时操作的话,开个线程就可以了。关于Service的运行状态有两种,启动状态和绑定状态,两种状态可以一起。启动一个Service只需调用Context的startService方法,传

2、进一个Intent即可。看起来好像很简单的说,那是因为Android为了方便开发者,做了很大程度的封装。那么你真的有去学习过Service是怎么启动的吗?Service的onCreate方法回调前都做了哪些准备工作?先上一张图大致了解下,灰色背景框起来的是同一个类中的方法,如下图:那接下来就从源码的角度来分析Service的启动过程。当然是从Context的startService方法开始,Context的实现类是ContextImpl,那么我们就看到ContextImpl的startService方法即可,如下:@OverridepublicComponentNamestartSe

3、rvice(Intentservice){warnIfCallingFromSystemProcess();returnstartServiceCommon(service,mUser);}会转到startServiceCommon方法,那跟进startServiceCommon方法方法瞧瞧。privateComponentNamestartServiceCommon(Intentservice,UserHandleuser){try{validateServiceIntent(service);service.prepareToLeaveProcess();ComponentNam

4、ecn=ActivityManagerNative.getDefault().startService(mMainThread.getApplicationThread(),service,service.resolveTypeIfNeeded(getContentResolver()),getOpPackageName(),user.getIdentifier());//代码省略returncn;}catch(RemoteExceptione){thrownewRuntimeException("Failurefromsystem",e);}}可以看到调用了ActivityMana

5、gerNative.getDefault()的startService方法来启动Service,ActivityManagerNative.getDefault()是ActivityManagerService,简称AMS。那么现在启动Service的过程就转移到了ActivityManagerService,我们关注ActivityManagerService的startService方法即可,如下:@OverridepublicComponentNamestartService(IApplicationThreadcaller,Intentservice,Stringresolv

6、edType,StringcallingPackage,intuserId)throwsTransactionTooLargeException{//代码省略synchronized(this){finalintcallingPid=Binder.getCallingPid();finalintcallingUid=Binder.getCallingUid();finallongorigId=Binder.clearCallingIdentity();ComponentNameres=mServices.startServiceLocked(caller,service,resolv

7、edType,callingPid,callingUid,callingPackage,userId);Binder.restoreCallingIdentity(origId);returnres;}}在上述的代码中,调用了ActiveServices的startServiceLocked方法,那么现在Service的启动过程从AMS转移到了ActiveServices了。继续跟进ActiveServices的startServiceLocked方法,如

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。