1. 程式人生 > >火星PHP基礎入門到高階開發教程 含Js、Mysql例項目前最完整

火星PHP基礎入門到高階開發教程 含Js、Mysql例項目前最完整

1.1 startActivity(ForResult)@Activity

Activity類的startActivity()對於Android開發者來說可謂是再熟悉不過了。作為應用程序啟動Activity的入口,經過一系列方法過載呼叫後,startActivity()最終會呼叫startActivityForResult(),並且傳入-1和null作為引數requestCode和options的值。

// #1 {root}/core/java/ android.app.Activity (L4872) public void startActivity(Intent intent) {     this.startActivity(intent, null); // 呼叫#2 }

// #2 {root}/core/java/ android.app.Activity (L4899) public void startActivity(Intent intent, Bundle options) {     if (options != null)          startActivityForResult(intent, -1, options);     else         startActivityForResult(intent, -1); // 呼叫#3 }

// #3 {root}/core/java/ android.app.Activity (L4543) public void startActivityForResult(Intent intent, int requestCode) {     startActivityForResult(intent, requestCode, null); // 呼叫#4 }

// #4 {root}/core/java/ android.app.Activity (L4581) public void startActivityForResult(Intent intent, int requestCode, Bundle options) {     ... } 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

1.2 [email protected]

startActivityForResult()委託Instrumentation物件的execStartActivity()執行Activity的啟動流程,然後對其返回的啟動結果進行處理。

// #4 {root}/core/java/ android.app.Activity (L4581) public void startActivityForResult(Intent intent, int requestCode, Bundle options) {     if (mParent == null) {         ...         Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(                this, mMainThread.getApplicationThread(), mToken,                 this, intent, requestCode, options); // 呼叫#5         if (ar != null)             mMainThread.sendActivityResult(                     mToken, mEmbeddedID, requestCode, ar.getResultCode(), ar.getResultData());         if (requestCode >= 0)              mStartedActivity = true;         ...     }     ... }

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 【L-03】if (mParent == null) { … } mParent是一個Activity型別的成員變數,它記錄了當前Activity的父Activity。Activity之間的父子關係既可以通過在Manifest中設定android:parentActivityName屬性來實現1,也可以由繼承自ActivityGroup的類(例如TabActivity)來定義2(官方在API 13後已經棄用了ActivityGroup,並推薦使用Fragment作為替代3)。因此,通常情況下mParent的取值為null,從而後續程式碼進入if分支。

【L-05】Instrumentation.ActivityResult ar = mInstrumentation.execStartActivity(…); mInstrumentation是一個Instrumentation型別的成員變數,簡單來說可以理解為應用程序的“管家”。每個應用程式有且僅有一個Instrumentation物件,並且每個Activity內部都持有對它的引用4。此處通過呼叫Instrumentation物件的execStartActivity(),將後續的Activity啟動流程委託給這位得力的“管家”來完成,然後從返回值ar中獲取並處理對應的啟動結果。

【L-09】mMainThread.sendActivityResult(…); mMainThread是一個ActivityThread型別的成員變數,它就是“通常所說”的主執行緒(UI執行緒)。此處呼叫ActivityThread的sendActivityResult(),將包括execStartActivity()的返回值ar在內的啟動結果(通過Handler)轉發出去5。需要特別指出的是,ActivityThread並沒有繼承Thread類,嚴格來說它只是一個“執行在主執行緒的物件”。當一個Android應用程序被建立後,虛擬機器會預先建立一個主執行緒6,然後在主執行緒中執行ActivityThread類的main方法(具體流程參見下文5.1節)。而真正意義上的“主執行緒Thread例項”雖然存在,但它的建立過程由虛擬機器進行管理,所以相關的程式碼是不可見的7。綜上所述,對於“主執行緒”這個概念比較嚴謹的描述是“ActivityThread執行的執行緒”8,而本文為了表述方便,仍會將ActivityThread直接稱為主執行緒。

【L-12】mStartedActivity = true; mStartedActivity是一個boolean型別的成員變數,當方法引數requestCode為非負值(即滿足判斷條件requestCode>=0)時,該變數被置為true,表明被啟動的Activity關閉(呼叫finish())後會返回一個(通過事先呼叫setResult()設定的)結果給當前Activity9。在收到返回的結果之前,當前Activity將一直保持不可見的狀態10