欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

通過(guò)實(shí)例解析android Activity啟動(dòng)過(guò)程

 更新時(shí)間:2020年09月28日 14:41:12   作者:海綿般汲取  
這篇文章主要介紹了通過(guò)實(shí)例解析android Activity啟動(dòng)過(guò)程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

注:只是說(shuō)明啟動(dòng)activity的過(guò)程(ActivityThread如何與ActivityManagerService簡(jiǎn)稱AmS進(jìn)行進(jìn)程間通信調(diào)用全過(guò)程),不解析android從zygote(受精卵)到整個(gè)系統(tǒng)服務(wù)的啟動(dòng)

具體來(lái)講,啟動(dòng)activity的方式有以下幾種:

  • 在應(yīng)用程序中startActivity()或startActivityForResult()方法啟動(dòng)指定activity
  • 在HOME(桌面)程序中單擊應(yīng)用圖標(biāo),啟動(dòng)新的activity
  • 按"BACK"鍵結(jié)束當(dāng)前activity,自動(dòng)啟動(dòng)上一個(gè)activity
  • 長(zhǎng)按“Home”鍵,顯示出當(dāng)前任務(wù)列表,從中選擇一個(gè)啟動(dòng)。

先分析第2種方式

android的HOMe桌面程序(launcher)是android系統(tǒng)啟動(dòng)的第一個(gè)應(yīng)用程序,其他的應(yīng)用程序安裝后,會(huì)在launcher上創(chuàng)建一個(gè)快捷圖標(biāo),我們點(diǎn)擊桌面上的快捷圖標(biāo)就會(huì)啟動(dòng)相應(yīng)的app

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

在android4.0\packages\apps\Launcher2\src\com\android\launcher2

當(dāng)點(diǎn)擊一個(gè)應(yīng)用圖標(biāo)時(shí)會(huì)執(zhí)行一連串流程

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

-》Launcher.startActivitySafely(v,intent,tag)這里比4.0多的一個(gè)參數(shù),可能性能優(yōu)化吧

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

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

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

到這里直接跳轉(zhuǎn)到第一個(gè)問題上來(lái)了(直接分析第一個(gè)就可以解決第二個(gè))

第4種方式---長(zhǎng)按“Home”鍵,顯示出當(dāng)前任務(wù)列表,從中選擇一個(gè)啟動(dòng)

流程:

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

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

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

假設(shè)一個(gè)app,ActivityA啟動(dòng)ActivityB,然后ActivityB按下"BACK"鍵其實(shí)執(zhí)行的是activity的finish()方法

簡(jiǎn)單流程:

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

ActivityB向AmS發(fā)送finish()請(qǐng)求

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

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

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通知當(dāng)前ActivityB進(jìn)入Paused狀態(tài),當(dāng)ActivityB進(jìn)入paused狀態(tài)后即Activity.onPause()方法執(zhí)行完后,通知AmS我已經(jīng)執(zhí)行完pause操作。于是AmS就準(zhǔn)備要在ActivityB所在的進(jìn)程和任務(wù)中恢復(fù)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已經(jīng)啟動(dòng)起來(lái)了,但是ActivityB還沒有被finish掉,在ActivityThread.H.handleResumeActivity中會(huì)

調(diào)用Looper.myQueue().addIdleHandler(new Idler()) 這個(gè)方法實(shí)現(xiàn)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的交互以后再補(bǔ)充)

第1種方式--ActivityA啟動(dòng)ActivityB為例

從startActivity()開始分析。

簡(jiǎn)單流程(有時(shí)間完整過(guò)一遍源碼)

Activity.startActivity
Activity.startActivityForResult
Instrumentation.execStartActivity
ActivityManagerProxy.startActivity
ActivityManagerService.startActivity
ActivityStack.startActivityMayWait
ActivityStack.startActivityLocked
ActivityStack.startActivityUncheckedLocked
ActivityStack.resumeTopActivityLocked
ActivityStack.startPausingLocked
ApplicationThreadProxy.schedulePauseActivity
ApplicationThread.schedulePauseActivity
ActivityThread.queueOrSendMessage
H.handleMessage
ActivityThread.handlePauseActivity
ActivityManagerProxy.activityPaused
ActivityManagerService.activityPaused
ActivityStack.activityPaused
ActivityStack.completePauseLocked
ActivityStack.resumeTopActivityLokced
ActivityStack.startSpecificActivityLocked
ActivityStack.realStartActivityLocked
ApplicationThreadProxy.scheduleLaunchActivity
ApplicationThread.scheduleLaunchActivity
ActivityThread.queueOrSendMessage
H.handleMessage
ActivityThread.handleLaunchActivity
ActivityThread.performLaunchActivity
AcitiviyB.onCreate

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

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

所以執(zhí)行請(qǐng)求都是傳遞到ActivityManagerService進(jìn)行處理

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

最新評(píng)論