context再看:app启动,mainlooper,context初始化,application初始化等

context具体实现是contextimpl,也就是application里attach时系统传入的basecontext,attach之后各种context的功能才会正常,context一共三种,application,activity,service,其它都不是context

ddfff

vhbhn

vbbbb

这涉及APP启动过程,app由系统启动,系统通过桌面这个程序来启动对应的app,首先找到apk文件进行分析和收集,然后把apk信息传入来启动app,我们从ActivityThread的main方法开始看,这是入口方法,标准的java入口main方法,这里面会启动mainlooper,即将一个looper放到当前threadlocal(mainthread),在开启looper循环之前,实例化一个activitythread,这时候H类会在activitytread里被初始化,也就是为啥在准备mainlooper之后和启动mainlooper之间实例化activitythread(不然启动mainlooper后就进入死循环了,同一个线程里后面的代码就无法执行了,所以启动mainlooper必须最后执行),然后调用activitythread的attach方法,这个方法是后续流程的开始,然后启动looper循环后,main方法就结束了

这里插一段looper说明,looper在主线程中启动之后就进入死循环,这里有两个问题,一,进入死循环后如何执行其它任务,二,死循环会不会消耗CPU资源,答案是同一个原理,即系统的epoll多路复用,大概跟nio一样,looper死循环一个是为了让主线程不退出,必须不能结束啊,它等待消息队列中的消息,来一个处理一个,等待的是多进程通信搞过来的消息,比如屏幕刷新view重绘,点击事件等,底层来看就是接收系统的叫醒,阻塞的时候是epoll闲置状态,等有事件了,在通过epoll叫醒,使用JAVA锁机制也可以实现,估计效率低?消息队列就是生产者消费者,主线程消费,其它线程生产,如果消息队列是主线程和其它线程共享的(looper放到了threadlocal就是不共享呗),那用JAVA的阻塞队列也可以吧,epoll waite换成lock的await

attach方法是个厉害的家伙,如果系统进程走到这,instrument类,contextImpl类,都在这new,如果是用户进程,就启用进程间通信机制,即applicationthread关联上activitymanager,用户进程是客户端,activitymanager是服务端,applicationtread是客户端驻服务端代表,服务端通过它跟客户端交互,这都走binder机制

说回application创建,我们断点到application的attachbasecontext方法,发现我们的H收到一个bindapplication的进程间调用,系统让我们绑定一个application,不晓得这是不是attach时applicationthread关联上之后的第一个事件,但对于我们的应用肯定是非常靠前的事件了,就从它开始往下说

handlebindapplication,主要应该是启动一个application,并把系统收集的apk资料绑定到application里,进程名啊,是不是24小时制啊,设备标识,debug设置,new一个instrumentioninfo,然后到了我们关注的,new一个contextImpl,设置一些什么设备图形支持,不管,然后再new一个ctxl,用来用反射new一个instrumention,虽然instrumention也很厉害,先不管,接着调用loadedapk的makeapplication,这个是要关心的,这个方法里,再new一个ctxl,再调用instrumention的newapplication方法,得到我们APP的application对象,同时调用application的attach方法,传入最后new的这个ctxl,即是basecontext,可见application和basecontext不是同一个对象,getbasecontext在这之后就会有值了,但是getapplicationcontext是没值的,这个函数会返回loadedapk的mapplication属性,而在attachbasecontext函数结束后这个属性才赋值的,就紧挨着application创建后,attach执行完后,赋值后又紧接着调用了instrumention的callapplicationoncreat,所以在oncreat里调用getapplicationcontext方法是有返回值的,先记录到这,从main函数到application的attach和oncreate

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 210,978评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 89,954评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,623评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,324评论 1 282
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,390评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,741评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,892评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,655评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,104评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,451评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,569评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,254评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,834评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,725评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,950评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,260评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,446评论 2 348

推荐阅读更多精彩内容