Android Service启动绑定流程是什么


这篇文章主要介绍了AndroidService启动绑定流程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇AndroidService启动绑定流程是什么文章都会有所收获,下面我们一起来看看吧。启动一个Service,通常在Activity调用startService来启动。startServiceCommon检查intent内容是否合法,然后做一些离开当前进程的准备操作。调用 ActivityManager.getService()获得AMS的本地引用,并调用其startService函数。也就是说通过Binder机制跨进程通信调用了AMSstartService函数。通过 ActivityManager.getService()的实现。AMS.startService函数获取调用PidUid,然后调用ActiveServicestartServiceLocked函数。ActiveService.startServiceLock函数,对一些合法性的检查,例如前台Service的权限、限制性后台Service进行延迟运行(standby)。并将要启动的信息封装成ServiceRecord。然后调用了startServiceInnerLocked函数。调用了bringUpServiceLocked函数,会将ServiceRecord添加到ServiceMap类型的smap集合,进行缓存。分析一:首次启动Service时,在执行bringUpServiceLocked函数,ServiceRecord是属于新创建的,而非从AMS的缓存mServices中检索而来,所以此时的ServiceRecordProcessRecord类型appIApplicationThread类型thread都是null。只有启动过后的ServiceRecord才有值,才会执行sendServiceArgsLocked函数,重复调用Service的生命周期onStartCommand,而不调用onCreate函数。通过ProcessRecord对象的IApplicationThread引用,通过Binder机制调用了应用程序的ApplicationThreadscheduleCreateService函数。将ServiceInfo等相关信息封装到CreateServiceData中,免费云主机域名并发送给ActivityThreadH类型的mH对象。调用了ActivityThreadhandleCreateService函数。通过ContextImpl.createAppContext创建Service的上下文context,通过packageInfo.getAppFactory().instantiateService反射获得当前Service对象service,将contextservice相互绑定。然后调用service.onCreate。至此,Service创建完毕。在分析一,主要判断入参Executor executorUserHandle user哪个为null,总有一个为null,但最终都是调用了LoadedApkgetServiceDispatcherCommon函数来获取ServiceDispathcer类型sd。影响只是回调代码是在主线程执行,还是线程池。这里传入ActivityThreadH对象,意味着后续连接成功回调onServiceConnected是在主线程。分析二:通过Binder机制调用AMSbindIsolatedService函数。IServiceConnection连接的创建会先从缓存中获取,避免每次都要新建。分析一:通过executorhandler创建ServiceDispatcher类型的sd,含有静态内部类InnerConnection的引用mIServiceConnection。继承自IServiceConnection.Stub,也就是InnerConnection是实现者,远程调用代理在其他进程,例如SystemServer进程中的ActiveServiceAMS经过两次重载函数bindIsolatedService调用,简单检查相关合法性。然后调用ActiveService类型的mServicebindServiceLocked函数。AppBindRecord 描述应用程序进程和Service的关联,包括谁绑定了ServiceProcessRecord,绑定信息IntentBindRecord,当前服务ServiceRecord,当前应用进程的所有连接记录connections。调用了ApplicationThreadscheduleBindService函数。将数据封装BindServiceData,发送个ActivityThread的H类型的mH处理。handleBindService函数有两个分支,即是否重新绑定。如果当前进程第一个与Service绑定,且调用过了onUbBinder方法,那么这里的data.rebind将为true,直接执行ServiceonRebind函数即可。另外一种就是没有绑定过,那么需要执行ServiceonBind函数。然后还要执行AMSpublishService函数。分析一:可见在第4步bindServiceLocked函数,IntentBindRecord对象的属性binderrequestedreceived都是false。在ServiceRecord的所有连接记录connections中,通过intent查找对应之前已经保存的ConnectionRecord,并调用其IServiceConnectionconnected函数。在第2步的时候调用bindServiceCommon函数时,会创建ServiceDispatcher时,内部持有InnerConnection实例,这里的IServiceConnection代理引用指向该InnerConnection实例,这里会调用其connected函数。这里调用了 mActivityThread.post(new RunConnection(name, service, 0, dead)),执行RunConnectionrun函数。这里的话run函数执行代码又回到了应用进程的主线程。RunConnectionServiceDispatcher的内部类,这里执行SDdoConnected函数。这里调用了ServiceConnection对象的onServiceConnected函数,也就是我们发起绑定,调用context.bindService的参数。到此,Service的绑定流程分析完毕。在第一节Service的启动流程最后函数调用了ActivityThreadhandleCreateService函数。分析一:通过ContextImpl的静态函数createAppContext返回了一个ContextImpl类型的contextcreateAppContext又调用了重载函数createAppContext。直接新建了ContextImpl实例context,构造函数传递了ActivityThread类型的mainThread和LoadedApk类型的packageInfo。并给context设置了资源环境和是否Syetem属性。ContextImpl类有一个Context类型的mOuterContext属性,在构造函数时指向了自己。回到handleCreateService函数的分析二,在创建好Service对象service之后,将service作为参数传递给了context.setOuterContext函数。Service本身继承自ContextWrapper,ContextWrapper又是Context的子类。这时候的setOuterContext函数将service设置给了contextmOuterContext属性。意味着当前上下文context持有当前新建的service引用。在分析三,调用了service.attach函数,context并作为第一个参数被传入。attach函数又调用了attachBaseContext函数。attachBaseContext调用了父类ContextWrapperattachBaseContext函数ContextWrapper将一路传递过来的上下文base设置给你了mBase属性。也就是说,我们在启动Service时,会同时创建Service的上下文context,并将其存储到Service的父类ContextWrappermBases属性中,同时context也会有当前Service引用,存储在mOuterContext变量中。关于“AndroidService启动绑定流程是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“AndroidService启动绑定流程是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。

相关推荐: Postgresql数据库角色创建登录的方法是什么

本篇内容主要讲解“Postgresql数据库角色创建登录的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Postgresql数据库角色创建登录的方法是什么”吧!PG中使用角色(role)机制来解决用户身份…

免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。

Like (0)
Donate 微信扫一扫 微信扫一扫
Previous 05/20 11:20
Next 05/20 11:25

相关推荐