日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

探索7.x, 全面解析Activity启动框架 (2)

發布時間:2025/3/15 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 探索7.x, 全面解析Activity启动框架 (2) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本文是探索Activity啟動源碼的第二篇, 其余參考第一篇.


Activity

第一篇的流程圖:


流程圖

第一篇已經探索至關鍵位置, 即ActivityStackSupervisor的realStartActivityLocked方法, 方法如其名, 從此開始, 才是真正地(Real)啟動(Start). Let's start!


ActivityManagerService

ActivityStackSupervisor#realStartActivityLocked:

final boolean realStartActivityLocked(ActivityRecord r, ProcessRecord app,boolean andResume, boolean checkConfig) throws RemoteException {// 當屏幕方向修改時, 推遲恢復, 防止冗余啟動Activity.if (checkConfig) {Configuration config = mWindowManager.updateOrientationFromAppTokens(mService.mConfiguration,r.mayFreezeScreenLocked(app) ? r.appToken : null);mService.updateConfigurationLocked(config, r, false, true /* deferResume */);}// 將進程描述符(ProcessRecord)設置入Activity描述符(ActivityRecord)r.app = app;app.waitingToKill = null; // 避免在后臺被殺死r.launchCount++; // 增加啟動次數r.lastLaunchTime = SystemClock.uptimeMillis(); // 最新啟動時間// 當Activity描述符不在進程的Activity列表中, 將Activity添加入進程的Activity列表int idx = app.activities.indexOf(r);if (idx < 0) {app.activities.add(r);}// AMS更新進程描述符為最少最新使用(LRU).mService.updateLruProcessLocked(app, true, null); // ...try {// ...// 遠程調用ApplicationThread的scheduleLaunchActivityapp.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);// ...} catch (RemoteException e) {// ...}// ...return true; }

ActivityRecord即Activity描述符(變量r), 含有被啟動的Activity信息;?ProcessRecord即進程描述符(變量app), 含有當前應用的進程信息.
app.thread類型是IApplicationThread, 通過IApplicationThread的代理ApplicationThreadProxy, 遠程調用ApplicationThread的scheduleLaunchActivity方法, ApplicationThread是IApplicationThread的最終實現.

啟動Activity再次AMS(ActivityManagerService)通過遠程調用(Binder)交給應用進程(ActivityThread)處理. ApplicationThread是ActivityThread的私有類.

ApplicationThread#scheduleLaunchActivity:

@Override public final void scheduleLaunchActivity(Intent intent, IBinder token, int ident,ActivityInfo info, Configuration curConfig, Configuration overrideConfig,CompatibilityInfo compatInfo, String referrer, IVoiceInteractor voiceInteractor,int procState, Bundle state, PersistableBundle persistentState,List<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {// ...// 即來自客戶端(AMS)的Activity描述符ActivityClientRecord r = new ActivityClientRecord();// 將AMS的Activity描述符, 轉換為當前進程的Activity描述符r.token = token;// ...// 封裝, 發送啟動消息給H類處理, 并傳遞Activity描述符sendMessage(H.LAUNCH_ACTIVITY, r); }

sendMessage是重載方法, 最終調用H類處理數據.

private void sendMessage(int what, Object obj, int arg1, int arg2, boolean async) {// ...// 最終由H類(Handler)處理數據mH.sendMessage(msg); }

將啟動Activity交給ActivityThread的Handler?H類處理.

private class H extends Handler {public void handleMessage(Message msg) {switch (msg.what) {case LAUNCH_ACTIVITY: {Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");ActivityClientRecord r = (ActivityClientRecord)msg.obj;// 設置Activity描述符的包信息r.packageInfo = getPackageInfoNoCheck(r.activityInfo.applicationInfo, r.compatInfo);// 至此, 完成啟動Activity已經由AMS交給當前應用, 在當前應用中啟動Activity.handleLaunchActivity(r, null);Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);} break;}} }

啟動Activity, 先由當前進程, 通過ActivityManagerNative#getDefault#startActivity方法, 交給AMS處理, AMS管理Activity的Stack和Task, 并設置Activity描述符(Record); 再通過app.thread#scheduleLaunchActivity方法, 繼續交給當前進程處理.

AMS切換當前線程的流程圖:


流程圖

ActivityThread

ActivityThread#handleLaunchActivity:

handleLaunchActivity調用performLaunchActivity方法, 繼續執行啟動, 在成功后, 調用handleResumeActivity方法, 執行顯示Activity.

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {// 因為當前進程正在活躍, 所以跳過在后臺中執行GC.unscheduleGcIdler();// ...// 確保使用最近的環境配置handleConfigurationChanged(null, null);if (localLOGV) Slog.v(TAG, "Handling launch of " + r);// 在創建Activity前, 初始化WindowManagerGlobal, 即WindowManagerServiceWindowManagerGlobal.initialize();// 執行啟動ActivityActivity a = performLaunchActivity(r, customIntent);// 在啟動成功后, 處理恢復Activityif (a != null) {r.createdConfig = new Configuration(mConfiguration);reportSizeConfigurations(r);Bundle oldState = r.state;// 恢復ActivityhandleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);// ...}} else {// 如果發生錯誤, 則AMS停止啟動Activitytry {ActivityManagerNative.getDefault().finishActivity(r.token, Activity.RESULT_CANCELED, null,Activity.DONT_FINISH_TASK_WITH_ACTIVITY);} catch (RemoteException ex) {throw ex.rethrowFromSystemServer();}}}

ActivityThread#performLaunchActivity:

performLaunchActivity方法是Activity啟動的核心:

  • 獲取Activity的組件信息(ComponentName);
  • 根據組件使用反射創建Activity(newActivity);
  • 將Activity綁定(attach)Application和BaseContext;
  • 相繼調用onCreate, onStart, onRestoreInstanceState, onPostCreate等方法.
  • 放入Activity列表(Map)中統一管理, token是key.
  • private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo = r.activityInfo;if (r.packageInfo == null) {// 通過應用信息, 兼容信息, 從PMS, 獲取Activity的包信息r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,Context.CONTEXT_INCLUDE_CODE);}// 獲取組件信息ComponentName component = r.intent.getComponent();if (component == null) {component = r.intent.resolveActivity(mInitialApplication.getPackageManager());r.intent.setComponent(component);}// 當指定Activity時, 使用包名和類名創建組件if (r.activityInfo.targetActivity != null) {component = new ComponentName(r.activityInfo.packageName,r.activityInfo.targetActivity);}Activity activity = null;try {java.lang.ClassLoader cl = r.packageInfo.getClassLoader();// 通過反射, 使用ClassLoader創建Activityactivity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);// ...} catch (Exception e) {// ...}try {// 使用單例模式, 創建ApplicationApplication app = r.packageInfo.makeApplication(false, mInstrumentation);// ...if (activity != null) {// 創建Activity的上下文BaseContextContext appContext = createBaseContextForActivity(r, activity);// ...// 將Activity綁定上下文appContext, 和應用appactivity.attach(appContext, this, getInstrumentation(), r.token,r.ident, app, r.intent, r.activityInfo, title, r.parent,r.embeddedID, r.lastNonConfigurationInstances, config,r.referrer, r.voiceInteractor, window);// ...// 設置主題int theme = r.activityInfo.getThemeResource();if (theme != 0) {activity.setTheme(theme);}activity.mCalled = false; // 判斷執行是否成功, 成功會置true// 調用Activity的onCreate方法.if (r.isPersistable()) {mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);} else {mInstrumentation.callActivityOnCreate(activity, r.state);}// ...// 調用Activity的onStart方法.if (!r.activity.mFinished) {activity.performStart();r.stopped = false;}// 調用Activity的onRestoreInstanceState方法.if (!r.activity.mFinished) {if (r.isPersistable()) {if (r.state != null || r.persistentState != null) {mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,r.persistentState);}} else if (r.state != null) {mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);}}// 調用Activity的onPostCreate方法.if (!r.activity.mFinished) {activity.mCalled = false; // 判斷執行是否成功, 成功會置trueif (r.isPersistable()) {mInstrumentation.callActivityOnPostCreate(activity, r.state,r.persistentState);} else {mInstrumentation.callActivityOnPostCreate(activity, r.state);}// ...}}r.paused = true;// 將Activity放入ActivityThread的Activity數組中統一管理.mActivities.put(r.token, r);} // ...return activity; }

    onPostCreate: Called when activity start-up is complete (after onStart() and onRestoreInstanceState(Bundle) have been called). Applications will generally not implement this method; it is intended for system classes to do final initialization after application code has run.
    在調用時, 表明Activity已經完全啟動, 只剩下顯示(onResume).

    通過分析performLaunchActivity, 我們也更加清晰Activity的生命周期, 順序如下, onCreate, onStart, onRestoreInstanceState, onPostCreate.?注意, onStart是Activity處理; 其余三個是Instrumentation處理, 支持繼承重寫相應方法, 自行處理.


    至此, Activity已經完全啟動, 并調用相應的生命周期方法.

    OK, that's all! Enjoy it!

    原文地址:?http://www.jianshu.com/p/574d7d3fa34f

    總結

    以上是生活随笔為你收集整理的探索7.x, 全面解析Activity启动框架 (2)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日本免费网 | 妺妺窝人体色www在线小说 | 亚洲三级图片 | 68日本xxxxxⅹxxx59| 国产原创视频 | 精品在线免费播放 | 久久久久亚洲AV成人无在 | 黄色av免费在线观看 | 日韩精品色呦呦 | 古装做爰无遮挡三级视频 | 性欧美lx╳lx╳ | 乱老熟女一区二区三区 | 国产久久精品 | 欧美怡红院视频一区二区三区 | 91免费版视频 | 黄网免费在线观看 | 黑人超碰| 亚洲av成人精品日韩在线播放 | 精品少妇一二三区 | 激情久久网站 | 日韩欧美视频在线免费观看 | 最新欧美大片 | 国产日韩一区二区三区在线观看 | 免费成人高清在线视频 | 国产黄a三级三级三级看三级男男 | 成人性生交大免费看 | 国产女主播喷水高潮网红在线 | 日韩日b视频 | 天天操天天玩 | 日韩毛片一级 | 亚洲欧美色图在线 | 色婷av| 国产一区二区三区在线视频观看 | 中国女人一级一次看片 | 日韩狠狠操 | 日日爱av| 黄色wwww | 波多野结衣在线播放 | 三上悠亚痴汉电车 | 国产午夜福利视频在线观看 | 无码国产精品一区二区免费式直播 | 伊人加勒比| 亚洲九九热 | 人妻丰满熟妇无码区免费 | 国产女人18水真多18精品一级做 | 黄色网址链接 | 久91 | 欧美人与性动交ccoo | 一本加勒比hezyo黑人 | 精品国产乱码久久久久久鸭王1 | 亚洲天堂一区二区在线 | 欧美成人精品激情在线观看 | 黄色av免费在线看 | 偷偷操视频| 中文字幕人乱码中文字 | 日本亲与子乱人妻hd | 91性视频| 亚洲乱码国产乱码精品天美传媒 | 四虎在线免费观看 | 恶虐女帝安卓汉化版最新版本 | 欧美大屁股熟妇bbbbbb | 一区二区视频观看 | 久久午夜一区 | 国产精品一区二区免费视频 | 欧美日韩午夜爽爽 | 日韩啪啪网站 | 日韩麻豆| 国产又爽又猛又粗的视频a片 | 韩日精品在线 | 三年电影在线观看 | 制服.丝袜.亚洲.另类.中文 | 91文字幕巨乱亚洲香蕉 | 久久性感美女视频 | 国产成人在线网站 | 久久精品视频网站 | 亚洲一二三四在线 | 少妇性l交大片免费观看 | av在线资源 | 免费污网站在线观看 | 国产又黄又湿 | 日本黄色片 | 日韩欧美国产一区二区三区在线观看 | 午夜视频久久久 | 啪啪的网站 | 欧美精品一区视频 | 91chinese在线 | www,xxx日本| 国产大片中文字幕在线观看 | 夜夜爽日日澡人人添 | 四虎在线视频 | 精品国产免费一区二区三区 | 五月天婷婷综合网 | 日韩影视一区二区三区 | 欧美日韩国产黄色 | 可以看黄色的网站 | 夜色一区二区 | 中文字幕av久久爽 | 欧美成人专区 | 超碰青草|