Android的Activity启动流程
⼀个Android系统的⼿机,⾯对桌⾯⼀⼤堆的应⽤图标,我们随便点击⼀个应⽤图标,打开该应⽤,然后就进⾏了该系统的业务流程,登录注册等等之类。那我们开发者在最初写项⽬的时候,都知道要有⼀个⼊⼝Activity,并且需要在l配置action和category,这样我们点击应⽤图标就会⾸先进⼊这个Activity⾥⾯,这样的Activity被称作主Activity,⾄于都已经到了主Activity⾥⾯去了,那么如果想要跳转到其它的页⾯,也很简单,使⽤startActivity⽅法就可以。
那我们有没有想过,点击桌⾯的应⽤图标,为什么就可以打开这个应⽤了呢?Android这个系统在后⾯都有哪些操作呢?
Android系统是基于Linux系统的,init进程是Linux操作系统⾥⾯由内核启动的⽤户级线程,是系统必不可少的程序之⼀。Zygote进程是整个系统创建新进程的核⼼进程,是由init进程fork出来的。那么除了Zygote整个整个系统的根进程,还有个SystemService进程,这个进程主要作⽤是启动各种系统服务。⽐如ActivityManagerService、PackageManagerService、WindowManagerService等等。
那么我们平时Android⼿机看到的桌⾯其实也是⼀个应⽤程序,将它称作Launcher,Launcher是由系统服务LauncherAppService进⾏启动的,LauncherAppService则是由SystemService来启动的。
ActivityManagerService⾥⾯的systemReady⽅法
⾸先,在ActivityManagerService⾥⾯可以到systemReady⽅法,这个⽅法什么时候调⽤呢?⼜是由
制作android软件流程谁调⽤呢?在SystemService进程启动过程中,在其中通过内部⽅法分别调⽤了boot service,core service和other service,在调⽤startOtherService的时候就会调⽤ActivityManagerService的systemReady⽅法。
ActivityManagerService的systemReady⽅法很长,我们着重看⼀个
systemReady⽅法⾥⾯的调⽤startHomeActivityLocked
startHomeActivityLocked的实现
这个顾名思义,就是启动⼀个home的Activity,那么针对Android操作系统来说,桌⾯看作⼀个Activity的话, 那么⽏庸置疑这个home的Activity指的就是桌⾯。
看看getHomeIntent⽅法
getHomeIntent⽅法
有没有发现这段代码我们很熟悉,就是我们经常写的要启动⼀个Activity,创建出⼀个intent,并给intent设置Component、flag和Category,注意这⾥的Category是android.intent.category.HOME
那么这种启动Activity的⽅式很明显是属于隐⼠启动,查看Launcher源码得知,在AndroidManifest⾥⾯配置Category为android.intent.category.HOME的是LauncherActivity。
LauncherActivity是继承ListActivity的,看看它的布局
LauncherActivity的布局⽂件
是不是很简单?就是⼀个ListView再加上个TextView,那么LauncherActivity的onCreate⽅法是什么样的呢?
LauncherActivity的onCreate⽅法
我们可以发现,getPackageManager这个⽅法⼀开始就初始化了PackageManager,这个⽤于查询⼿机⾥⾯所有的应⽤程序包名、应⽤名、图标等,将这些作为数据源,放⼊到Adapter中,这样我们在桌⾯上所看到的应⽤程序名字和图标信息皆是来源于此。
ListView的item点击监听
ListView的onListItemClick⽅法
很简单,就是创建⼀个intent,然后startActivity⽅式启动这个Activity。
看看intentForPosition⽅法
intentForPosition⽅法
到现在为⽌的分析来看,Launcher程序本⾝就是⼀个安卓应⽤程序,只不过是系统默认启动的第⼀个应⽤程序。那我们在Launcher程序LauncherActivity提供了⼀个应⽤程序视图,可以供⽤户点击隐⼠打开⼀个应⽤程序。
那么,接下去看看startActivity这个过程
Activity的startActivityForResult
不管我们是调⽤startActivity(Intent intent)还是startActivity(Intent intent, Bundle options)最终都会执⾏到startActivityForResult⽅法
看看这个⽅法⾥⾯的关键代码
Activity⾥⾯的startActivityForResult
发现了⼀个新的类Instrumentation,是这个Instrumentation的实例调⽤了execStartActivity⽅法。Instrumentation类是Android操作系统中程序端操作Activity的具体操作类,当系统需要具体执⾏Activity的某个操作时,都需要借助于Instrumentation来进⾏具体实现。
Instrumentation的execStartActivity⽅法
再来看关键的代码
public ActivityResult execStartActivity( Context who, IBinder contextThread, IBinder token, Activity target, Intent intent, int requestCode, Bundle options, UserHandle user) {
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论