这篇文章主要介绍了AndroidService启动绑定流程是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇AndroidService启动绑定流程是什么文章都会有所收获,下面我们一起来看看吧。启动一个Service
,通常在Activity
调用startService
来启动。startServiceCommon
检查intent
内容是否合法,然后做一些离开当前进程的准备操作。调用 ActivityManager.getService()
获得AMS
的本地引用,并调用其startService
函数。也就是说通过Binder
机制跨进程通信调用了AMS
的startService
函数。通过 ActivityManager.getService()
的实现。AMS.startService
函数获取调用Pid
和Uid
,然后调用ActiveService
的startServiceLocked
函数。ActiveService.startServiceLock
函数,对一些合法性的检查,例如前台Service
的权限、限制性后台Service
进行延迟运行(standby)
。并将要启动的信息封装成ServiceRecord
。然后调用了startServiceInnerLocked
函数。调用了bringUpServiceLocked
函数,会将ServiceRecord
添加到ServiceMap
类型的smap
集合,进行缓存。分析一:首次启动Service
时,在执行bringUpServiceLocked
函数,ServiceRecord
是属于新创建的,而非从AMS
的缓存mServices
中检索而来,所以此时的ServiceRecord
的ProcessRecord
类型app
和IApplicationThread
类型thread
都是null。只有启动过后的ServiceRecord
才有值,才会执行sendServiceArgsLocked
函数,重复调用Service
的生命周期onStartCommand
,而不调用onCreate
函数。通过ProcessRecord
对象的IApplicationThread
引用,通过Binder
机制调用了应用程序的ApplicationThread
的scheduleCreateService
函数。将ServiceInfo
等相关信息封装到CreateServiceData
中,免费云主机域名并发送给ActivityThread
的H
类型的mH
对象。调用了ActivityThread
的handleCreateService
函数。通过ContextImpl.createAppContext
创建Service
的上下文context
,通过packageInfo.getAppFactory().instantiateService
反射获得当前Service
对象service
,将context
与service
相互绑定。然后调用service.onCreate
。至此,Service
创建完毕。在分析一,主要判断入参Executor executor
或UserHandle user
哪个为null
,总有一个为null
,但最终都是调用了LoadedApk
的getServiceDispatcherCommon
函数来获取ServiceDispathcer
类型sd。影响只是回调代码是在主线程执行,还是线程池。这里传入ActivityThread
的H
对象,意味着后续连接成功回调onServiceConnected
是在主线程。分析二:通过Binder机制调用AMS
的bindIsolatedService
函数。IServiceConnection
连接的创建会先从缓存中获取,避免每次都要新建。分析一:通过executor
或handler
创建ServiceDispatcher
类型的sd
,含有静态内部类InnerConnection
的引用mIServiceConnection
。继承自IServiceConnection.Stub
,也就是InnerConnection
是实现者,远程调用代理在其他进程,例如SystemServer
进程中的ActiveService
。AMS
经过两次重载函数bindIsolatedService
调用,简单检查相关合法性。然后调用ActiveService
类型的mService
的bindServiceLocked
函数。AppBindRecord
描述应用程序进程和Service
的关联,包括谁绑定了Service
的ProcessRecord
,绑定信息IntentBindRecord
,当前服务ServiceRecord
,当前应用进程的所有连接记录connections
。调用了ApplicationThread
的scheduleBindService
函数。将数据封装BindServiceData
,发送个ActivityThread
的H类型的mH
处理。handleBindService
函数有两个分支,即是否重新绑定。如果当前进程第一个与Service
绑定,且调用过了onUbBinder
方法,那么这里的data.rebind
将为true
,直接执行Service
的onRebind
函数即可。另外一种就是没有绑定过,那么需要执行Service
的onBind
函数。然后还要执行AMS
的publishService
函数。分析一:可见在第4步bindServiceLocked
函数,IntentBindRecord
对象的属性binder
、requested
、received
都是false
。在ServiceRecord
的所有连接记录connections
中,通过intent
查找对应之前已经保存的ConnectionRecord
,并调用其IServiceConnection
的connected
函数。在第2步的时候调用bindServiceCommon
函数时,会创建ServiceDispatcher
时,内部持有InnerConnection
实例,这里的IServiceConnection
代理引用指向该InnerConnection
实例,这里会调用其connected
函数。这里调用了 mActivityThread.post(new RunConnection(name, service, 0, dead))
,执行RunConnection
的run
函数。这里的话run函数执行代码又回到了应用进程的主线程。RunConnection
是ServiceDispatcher
的内部类,这里执行SD
的doConnected
函数。这里调用了ServiceConnection
对象的onServiceConnected
函数,也就是我们发起绑定,调用context.bindService
的参数。到此,Service
的绑定流程分析完毕。在第一节Service的启动流程最后函数调用了ActivityThread
的handleCreateService
函数。分析一:通过ContextImpl
的静态函数createAppContext
返回了一个ContextImpl
类型的context
。createAppContext
又调用了重载函数createAppContext
。直接新建了ContextImpl实例context,构造函数传递了ActivityThread类型的mainThread和LoadedApk类型的packageInfo。并给context设置了资源环境和是否Syetem属性。ContextImpl
类有一个Context
类型的mOuterContext
属性,在构造函数时指向了自己。回到handleCreateService
函数的分析二,在创建好Service
对象service
之后,将service
作为参数传递给了context.setOuterContext
函数。Service
本身继承自ContextWrapper
,ContextWrapper
又是Context
的子类。这时候的setOuterContext
函数将service
设置给了context
的mOuterContext
属性。意味着当前上下文context
持有当前新建的service
引用。在分析三,调用了service.attach
函数,context
并作为第一个参数被传入。attach
函数又调用了attachBaseContext
函数。attachBaseContext
调用了父类ContextWrapper
的attachBaseContext
函数ContextWrapper
将一路传递过来的上下文base
设置给你了mBase
属性。也就是说,我们在启动Service
时,会同时创建Service
的上下文context
,并将其存储到Service的父类ContextWrapper
的mBases
属性中,同时context
也会有当前Service引用,存储在mOuterContext
变量中。关于“AndroidService启动绑定流程是什么”这篇文章的内容就介绍到这里,感谢各位的阅读!相信大家对“AndroidService启动绑定流程是什么”知识都有一定的了解,大家如果还想学习更多知识,欢迎关注百云主机行业资讯频道。
相关推荐: Postgresql数据库角色创建登录的方法是什么
本篇内容主要讲解“Postgresql数据库角色创建登录的方法是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Postgresql数据库角色创建登录的方法是什么”吧!PG中使用角色(role)机制来解决用户身份…
免责声明:本站发布的图片视频文字,以转载和分享为主,文章观点不代表本站立场,本站不承担相关法律责任;如果涉及侵权请联系邮箱:360163164@qq.com举报,并提供相关证据,经查实将立刻删除涉嫌侵权内容。