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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

【Android 启动过程】Activity 启动源码分析 ( Activity -> AMS、主线程阶段 )

發布時間:2025/6/17 Android 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【Android 启动过程】Activity 启动源码分析 ( Activity -> AMS、主线程阶段 ) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

文章目錄

  • 一、Activity 啟動源碼分析 ( Activity -> AMS 階段 )





一、Activity 啟動源碼分析 ( Activity -> AMS 階段 )



調用 startActivity(new Intent()); 方法啟動 Activity , 調用方法原型如下 :

public class Activity extends ContextThemeWrapperimplements LayoutInflater.Factory2,Window.Callback, KeyEvent.Callback,OnCreateContextMenuListener, ComponentCallbacks2,Window.OnWindowDismissedCallback,AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient {/*** 與 {@link #startActivity(Intent, Bundle)} 方法相同 , * Bundle options 參數設置為 null** @param intent 啟動的意圖.** @throws android.content.ActivityNotFoundException** @see #startActivity(Intent, Bundle)* @see #startActivityForResult*/@Overridepublic void startActivity(Intent intent) {this.startActivity(intent, null);} }

完整代碼查看 frameworks/base/core/java/android/app/Activity.java 地址 ;


在 public void startActivity(Intent intent) 方法中 , 執行 this.startActivity(intent, null) 方法 , 方法原型如下 :

public class Activity extends ContextThemeWrapperimplements LayoutInflater.Factory2,Window.Callback, KeyEvent.Callback,OnCreateContextMenuListener, ComponentCallbacks2,Window.OnWindowDismissedCallback,AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient {/*** 開展一項新活動。您將不會收到關于何時開始的任何信息* 活動退出。此實現將覆蓋基本版本,* 提供關于* 執行啟動的活動。因為這個額外的* 信息,{@link Intent#FLAG_ACTIVITY_NEW_TASK}啟動標志不可用* 必修的;如果未指定,則新活動將添加到* 調用方的任務。** <p>此方法引發{@link android.content.ActivityNotFoundException}* 如果沒有找到運行給定意圖的活動。** @param intent 要啟動的意圖.* @param options 有關如何啟動活動的其他選項.* 更多細節查看 {@link android.content.Context#startActivity(Intent, Bundle)}* Context.startActivity(Intent, Bundle)} .** @throws android.content.ActivityNotFoundException** @see #startActivity(Intent)* @see #startActivityForResult*/@Overridepublic void startActivity(Intent intent, @Nullable Bundle options) {if (mIntent != null && mIntent.hasExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN)&& mIntent.hasExtra(AutofillManager.EXTRA_RESTORE_CROSS_ACTIVITY)) {if (TextUtils.equals(getPackageName(),intent.resolveActivity(getPackageManager()).getPackageName())) {// Apply Autofill restore mechanism on the started activity by startActivity()final IBinder token =mIntent.getIBinderExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN);// Remove restore ability from current activitymIntent.removeExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN);mIntent.removeExtra(AutofillManager.EXTRA_RESTORE_CROSS_ACTIVITY);// Put restore tokenintent.putExtra(AutofillManager.EXTRA_RESTORE_SESSION_TOKEN, token);intent.putExtra(AutofillManager.EXTRA_RESTORE_CROSS_ACTIVITY, true);}}// 如果有選項 , 執行 startActivityForResult 3 參數方法if (options != null) {startActivityForResult(intent, -1, options);} else {// 如果沒有選項 , 執行 startActivityForResult 2 參數方法// Note we want to go through this call for compatibility with// applications that may have overridden the method.startActivityForResult(intent, -1);}} }

完整代碼查看 frameworks/base/core/java/android/app/Activity.java 地址 ;


public void startActivityForResult(@RequiresPermission Intent intent, int requestCode, @Nullable Bundle options) 函數原型 :

public class Activity extends ContextThemeWrapperimplements LayoutInflater.Factory2,Window.Callback, KeyEvent.Callback,OnCreateContextMenuListener, ComponentCallbacks2,Window.OnWindowDismissedCallback,AutofillManager.AutofillClient, ContentCaptureManager.ContentCaptureClient {/*** 啟動一項活動,在該活動完成時希望獲得結果。* 當此活動退出時,您的* 將使用給定的請求代碼調用onActivityResult()方法。* 使用否定的requestCode與調用* {@link#startActivity}(該活動不是作為子活動啟動的)。** <p>請注意,此方法僅應與Intent協議一起使用* 定義為返回結果的。在其他協議中(例如* {@link Intent#ACTION_MAIN}或{@link Intent#ACTION_VIEW}),您可以* 在你期望的時候沒有得到結果。例如,如果您選擇的活動* 如果啟動使用{@link Intent#FLAG_ACTIVITY_NEW_TASK},則不會* 運行您的任務,您將立即收到取消結果。** <p>作為特例,如果使用requestCode調用startActivityForResult()* >=0,在初始的onCreate(Bundle savedInstanceState)/onResume()過程中* 活動,則在顯示結果之前不會顯示窗口* 從已啟動的活動返回。這是為了避免可見* 重定向到其他活動時閃爍。** <p>此方法引發{@link android.content.ActivityNotFoundException}* 如果沒有找到運行給定意圖的活動。** @param intent 要啟動的意圖.* @param requestCode 如果>=0,則當活動退出時,此代碼將在onActivityResult()中返回.* @param options 有關如何啟動活動的其他選項。* See {@link android.content.Context#startActivity(Intent, Bundle)}* Context.startActivity(Intent, Bundle)} for more details.** @throws android.content.ActivityNotFoundException** @see #startActivity*/public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,@Nullable Bundle options) {if (mParent == null) {options = transferSpringboardActivityOptions(options);// 調用 Instrumentation 方法 // Instrumentation 負責啟動 Application 和 Activity // 插件化時 , 此處是一個 Hook 點Instrumentation.ActivityResult ar =mInstrumentation.execStartActivity(this, mMainThread.getApplicationThread(), mToken, this,intent, requestCode, options);if (ar != null) {mMainThread.sendActivityResult(mToken, mEmbeddedID, requestCode, ar.getResultCode(),ar.getResultData());}if (requestCode >= 0) {// 如果此開始要求結果,我們可以避免// 在收到結果之前,活動是可見的。背景// 此代碼在onCreate(Bundle savedInstanceState)或onResume()期間將保持// 在此期間隱藏活動,以避免閃爍。// 這只能在請求結果時執行,因為// 這保證了我們會在// 不管發生什么,活動都已完成。mStartedActivity = true;}cancelInputsAndStartExitTransition(options);// TODO Consider clearing/flushing other event sources and events for child windows.} else {if (options != null) {mParent.startActivityFromChild(this, intent, requestCode, options);} else {// Note we want to go through this method for compatibility with// existing applications that may have overridden it.mParent.startActivityFromChild(this, intent, requestCode);}}} }

完整代碼查看 frameworks/base/core/java/android/app/Activity.java ;


分析 mInstrumentation.execStartActivity( this, mMainThread.getApplicationThread(), mToken, this, intent, requestCode, options) 方法 , 注意傳入的參數是 777 個參數 , 函數原型為 :

public class Instrumentation {/*** 執行應用程序發出的startActivity調用。默認值* 實現負責更新任何活動的{@link ActivityMonitor}* 對象并將此調用分派給系統活動管理器;你可以* 覆蓋此選項以監視應用程序啟動活動,以及* 修改它執行時發生的情況。* * <p>此方法返回一個{@link ActivityResult}對象,您可以* 在攔截應用程序調用時使用,以避免執行啟動* 活動操作,但仍返回應用程序運行的結果* 期望。為此,重寫此方法以捕獲對start的調用* 活動,以便返回包含結果的新ActivityResult* 您希望應用程序能夠看到,并且不要調用超級用戶* 班級。請注意,應用程序僅在以下情況下才期望結果:* <var>requestCode</var>is&amp;gt;=0* * <p>此方法引發{@link android.content.ActivityNotFoundException}* 如果沒有找到運行給定意圖的活動。* * @param who 從中啟動活動的上下文的參數。* @param contextThread 活動所在上下文的主線程正在啟動。* @param token 標識要啟動的系統的內部令牌活動;可能為空。* @param target 哪個活動正在執行啟動(并因此接收任何結果);如果未進行此調用,則可能為null從一項活動中。* @param intent 啟動的實際意圖。* @param requestCode 標識符;如果調用方不希望得到結果設置小于 0。* @param options 參數選項添加選項。* @return 要強制返回特定結果,請返回包含所需數據的ActivityResult對象;* 否則返回null。默認實現總是返回null。** @throws android.content.ActivityNotFoundException** @see Activity#startActivity(Intent)* @see Activity#startActivityForResult(Intent, int)* @see Activity#startActivityFromChild** {@hide}*/public ActivityResult execStartActivity(Context who, IBinder contextThread, IBinder token, Activity target,Intent intent, int requestCode, Bundle options) {IApplicationThread whoThread = (IApplicationThread) contextThread;Uri referrer = target != null ? target.onProvideReferrer() : null;if (referrer != null) {intent.putExtra(Intent.EXTRA_REFERRER, referrer);}if (mActivityMonitors != null) {synchronized (mSync) {final int N = mActivityMonitors.size();for (int i=0; i<N; i++) {final ActivityMonitor am = mActivityMonitors.get(i);ActivityResult result = null;if (am.ignoreMatchingSpecificIntents()) {result = am.onStartActivity(intent);}if (result != null) {am.mHits++;return result;} else if (am.match(who, null, intent)) {am.mHits++;if (am.isBlocking()) {return requestCode >= 0 ? am.getResult() : null;}break;}}}}try {intent.migrateExtraStreamToClipData();intent.prepareToLeaveProcess(who);// 在此處調用 AMS , Binder 機制獲取 AMSint result = ActivityManager.getService().startActivity(whoThread, who.getBasePackageName(), intent,intent.resolveTypeIfNeeded(who.getContentResolver()),token, target != null ? target.mEmbeddedID : null,requestCode, 0, null, options);checkStartActivityResult(result, intent);} catch (RemoteException e) {throw new RuntimeException("Failure from system", e);}return null;} }

完整代碼查看 frameworks/base/core/java/android/app/Instrumentation.java ;

總結

以上是生活随笔為你收集整理的【Android 启动过程】Activity 启动源码分析 ( Activity -> AMS、主线程阶段 )的全部內容,希望文章能夠幫你解決所遇到的問題。

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