电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

通過實例解析android Activity啟動過程

瀏覽:7日期:2022-09-22 13:17:01

注:只是說明啟動activity的過程(ActivityThread如何與ActivityManagerService簡稱AmS進行進程間通信調用全過程),不解析android從zygote(受精卵)到整個系統服務的啟動

具體來講,啟動activity的方式有以下幾種:

在應用程序中startActivity()或startActivityForResult()方法啟動指定activity 在HOME(桌面)程序中單擊應用圖標,啟動新的activity 按'BACK'鍵結束當前activity,自動啟動上一個activity 長按“Home”鍵,顯示出當前任務列表,從中選擇一個啟動。

先分析第2種方式

android的HOMe桌面程序(launcher)是android系統啟動的第一個應用程序,其他的應用程序安裝后,會在launcher上創建一個快捷圖標,我們點擊桌面上的快捷圖標就會啟動相應的app

桌面程序Launcher.java(源碼基于4.2.2,我沒有下載4.2.2,參考網上源碼)

在android4.0packagesappsLauncher2srccomandroidlauncher2

當點擊一個應用圖標時會執行一連串流程

-》Launcher.onClick(View v)單擊app圖標

-》Launcher.startActivitySafely(v,intent,tag)這里比4.0多的一個參數,可能性能優化吧

-》Launcher.startActivity(v, intent,tag)

-》Activity.startActivity(intent,opts.toBundle())

-》Activity.startActivityForResult(intent,-1,options);

到這里直接跳轉到第一個問題上來了(直接分析第一個就可以解決第二個)

第4種方式---長按“Home”鍵,顯示出當前任務列表,從中選擇一個啟動

流程:

public static final int KEYCODE_HOME = 3;PhoneWindowManager.interceptKeyBeforeDispatching()處理長按home事件showRecentAppsDialog();//彈出近期任務的對話框 RecentApplicationsDialog.onclick.getContext().startActivity(intent);//到這里流程就相同了

這個調用的其實也是第1種的startActivity()。所以1,2,4可以用相同處理流程解析,在后面接紹第1中方式處理流程-----fly

第3種方式(原理與第1種大致相同)

假設一個app,ActivityA啟動ActivityB,然后ActivityB按下'BACK'鍵其實執行的是activity的finish()方法

簡單流程:

ActivityB.finish() Activity.finish() ActivityManagerNative.getDefault().finishActivity() ActivityManagerService.finishActivity() ActivityStack.requestFinishActivityLocked() ActivityStack.finishActivityLocked() ActivityStack.startPausingLocked()

ActivityB向AmS發送finish()請求

// If the activity is PAUSING, we will complete the finish once// it is done pausing; else we can just directly finish it here.

上面解釋。AmS會先會在ActivityStack.finishActivityLocked()方法中檢查我們要finish的activity的狀態是否處于pause狀態,如果是將直接執行finish操作,否則,必須先執行startPausingLocked()---這里終點是resume恢復上一個ActivityA,將A顯示在前臺窗口

IApplicationThread.schedulePauseActivity() ActivityThread.schedulePauseActivity() ActivityThread.sendMessage() ActivityThread.H.sendMessage() ActivityThread.H.handleMessage() ActivityThread.handlePauseActivity() ActivityThread.performPauseActivity() Instrumentation.callActivityOnPause() Activity.performPause() Activity.onPause() ActivityManagerNative.getDefault().activityPaused() ActivityManagerService.activityPaused() ActivityStack.activityPausedLocked() ActivityStack.completePauseLocked()

接上面,AmS通知當前ActivityB進入Paused狀態,當ActivityB進入paused狀態后即Activity.onPause()方法執行完后,通知AmS我已經執行完pause操作。于是AmS就準備要在ActivityB所在的進程和任務中恢復ActivityA了;

ActivityStack.resumeTopActivityLocked() ActivityStack.resumeTopInnerLocked() IApplicationThread.scheduleResumeActivity() ActivityThread.scheduleResumeActivity() ActivityThread.sendMessage() ActivityTherad.H.sendMessage() ActivityThread.H.handleMessage() ActivityThread.H.handleResumeActivity() Activity.performResume() Activity.performRestart() Instrumentation.callActivityOnRestart() Activity.onRestart() Activity.performStart() Instrumentation.callActivityOnStart() Activity.onStart() Instrumentation.callActivityOnResume() Activity.onResume()

到這里activityA已經啟動起來了,但是ActivityB還沒有被finish掉,在ActivityThread.H.handleResumeActivity中會

調用Looper.myQueue().addIdleHandler(new Idler()) 這個方法實現ActivityB的最終銷毀操作

Looper.myQueue().addIdleHandler(new Idler()) ActivityManagerNative.getDefault().activityIdle() ActivityManagerService.activityIdle() ActivityStackSupervisor.activityIdleInternalLocked() ActivityStack.destroyActivityLocked() IApplicationThread.scheduleDestoryActivity() ActivityThread.scheduleDestoryActivity() ActivityThread.sendMessage() ActivityThread.H.sendMessage() ActivityThread.H.handleMessage() ActivityThread.handleDestoryActivity() ActivityThread.performDestoryActivity() Activity.performStop() Instrumentation.callActivityOnStop() Activity.onStop() Instrumentation.callActivityOnDestory() Activity.performDestory() Acitivity.onDestory() ActivityManagerNative.getDefault().activityDestoryed() ActivityManagerService.activityDestoryed() ActivityStack.activityDestoryedLocked()

這就是finish()的全部流程了(具體與WindowsManagerService的交互以后再補充)

第1種方式--ActivityA啟動ActivityB為例

從startActivity()開始分析。

簡單流程(有時間完整過一遍源碼)

Activity.startActivityActivity.startActivityForResultInstrumentation.execStartActivityActivityManagerProxy.startActivityActivityManagerService.startActivityActivityStack.startActivityMayWaitActivityStack.startActivityLockedActivityStack.startActivityUncheckedLockedActivityStack.resumeTopActivityLockedActivityStack.startPausingLockedApplicationThreadProxy.schedulePauseActivityApplicationThread.schedulePauseActivityActivityThread.queueOrSendMessageH.handleMessageActivityThread.handlePauseActivityActivityManagerProxy.activityPausedActivityManagerService.activityPausedActivityStack.activityPausedActivityStack.completePauseLockedActivityStack.resumeTopActivityLokcedActivityStack.startSpecificActivityLockedActivityStack.realStartActivityLockedApplicationThreadProxy.scheduleLaunchActivityApplicationThread.scheduleLaunchActivityActivityThread.queueOrSendMessageH.handleMessageActivityThread.handleLaunchActivityActivityThread.performLaunchActivityAcitiviyB.onCreate

要查看ActivityManagerNative.java,ActivityManagerProxy.java,ActivityManagerService,還有binder關系看一張圖就可以了

通過實例解析android Activity啟動過程

從圖中可以看出代理類:使用ActivityManagerProxy代理類,來代理ActivityManagerNative類的子類ActivityManagerService;

所以執行請求都是傳遞到ActivityManagerService進行處理

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持好吧啦網。

標簽: Android
相關文章:
主站蜘蛛池模板: 海外仓系统|国际货代系统|退货换标系统|WMS仓储系统|海豚云 | 汽液过滤网厂家_安平县银锐丝网有限公司 | 纳米二氧化硅,白炭黑,阴离子乳化剂-臻丽拾科技 | 卧涛科技有限公司科技项目申报公司|高新技术企业申报|专利申请 | POS机办理_个人pos机免费领取-银联pos机申请首页 | 找果网 | 苹果手机找回方法,苹果iPhone手机丢了找回,认准找果网! | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 微型实验室真空泵-无油干式真空泵-微型涡旋耐腐蚀压缩机-思科涡旋科技(杭州)有限公司 | 机房监控|动环监控|动力环境监控系统方案产品定制厂家 - 迈世OMARA | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 软文发布平台 - 云软媒网络软文直编发布营销推广平台 | 定坤静电科技静电消除器厂家-除静电设备| 蜘蛛车-高空作业平台-升降机-高空作业车租赁-臂式伸缩臂叉装车-登高车出租厂家 - 普雷斯特机械设备(北京)有限公司 | 淋巴细胞分离液_口腔医疗器材-精欣华医疗器械(无锡)有限公司 | 低气压试验箱_高低温低气压试验箱_低气压实验箱 |林频试验设备品牌 | 上海办公室装修公司_办公室设计_直营办公装修-羚志悦装 | DAIKIN电磁阀-意大利ATOS电磁阀-上海乾拓贸易有限公司 | 密封无忧网 _ 专业的密封产品行业信息网| 全自动在线分板机_铣刀式在线分板机_曲线分板机_PCB分板机-东莞市亿协自动化设备有限公司 | 耐磨陶瓷,耐磨陶瓷管道_厂家-淄博拓创陶瓷科技 | 铝单板_铝窗花_铝单板厂家_氟碳包柱铝单板批发价格-佛山科阳金属 | 派财经_聚焦数字经济内容服务平台| 塑料造粒机「厂家直销」-莱州鑫瑞迪机械有限公司 | 深圳快餐店设计-餐饮设计公司-餐饮空间品牌全案设计-深圳市勤蜂装饰工程 | 空心明胶胶囊|植物胶囊|清真胶囊|浙江绿键胶囊有限公司欢迎您! | 知网论文检测系统入口_论文查重免费查重_中国知网论文查询_学术不端检测系统 | 礼堂椅厂家|佛山市艺典家具有限公司| 拼装地板,悬浮地板厂家,悬浮式拼装运动地板-石家庄博超地板科技有限公司 | 存包柜厂家_电子存包柜_超市存包柜_超市电子存包柜_自动存包柜-洛阳中星 | 小区健身器材_户外健身器材_室外健身器材_公园健身路径-沧州浩然体育器材有限公司 | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 数码听觉统合训练系统-儿童感觉-早期言语评估与训练系统-北京鑫泰盛世科技发展有限公司 | 智慧钢琴-电钢琴-便携钢琴-数码钢琴-深圳市特伦斯乐器有限公司 | 滑石粉,滑石粉厂家,超细滑石粉-莱州圣凯滑石有限公司 | 披萨石_披萨盘_电器家电隔热绵加工定制_佛山市南海区西樵南方综合保温材料厂 | 塑钢件_塑钢门窗配件_塑钢配件厂家-文安县启泰金属制品有限公司 深圳南财多媒体有限公司介绍 | LHH药品稳定性试验箱-BPS系列恒温恒湿箱-意大利超低温冰箱-上海一恒科学仪器有限公司 | 培训一点通 - 合肥驾校 - 合肥新亚驾校 - 合肥八一驾校 | 浙江宝泉阀门有限公司 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | 六自由度平台_六自由度运动平台_三自由度摇摆台—南京全控科技 |