android 28 startActivity起動プロセス分析(一)--ローカルからAMS呼び出しパラメータ照合

2419 ワード

ユーザーコールActivity:startActivity()---->Activity:startActivity ForResult()-->Instrumentation:execStartActivity()-->リモートAMS
Instrumentation.java
public ActivityResult execStartActivity(
        Context who, IBinder contextThread, IBinder token, Activity target,
        Intent intent, int requestCode, Bundle options) {
......
int result = ActivityManager.getService()
    .startActivity(whoThread, who.getBasePackageName(), intent,
            intent.resolveTypeIfNeeded(who.getContentResolver()),
            token, target != null ? target.mEmbeddedID : null,
            requestCode, 0, null, options);
}

ActivityManagerServicesを呼び出します.java
public final int startActivity(IApplicationThread caller, String callingPackage,
        Intent intent, String resolvedType, IBinder resultTo, String resultWho, int requestCode,
        int startFlags, ProfilerInfo profilerInfo, Bundle bOptions) {
    return startActivityAsUser(caller, callingPackage, intent, resolvedType, resultTo,
            resultWho, requestCode, startFlags, profilerInfo, bOptions,
            UserHandle.getCallingUserId());
}

ExcStartActivity()-->Ams startActivity()メソッドで呼び出されたパラメータ対照表:
これらのパラメータはやはり重要で、Ams以降の呼び出しプロセスではこれらのパラメータが使用されますが、Amsの中の新しいパラメータの名前の一部は理解しにくいので、ここでは特に列挙します. 
ActivityManagerService.java         startActivity()
Instrumentatiaon.java     execStartActivity()
釈義
caller
whothread
Binderは、メインスレッドを適用する識別子と見なすことができます
callingPackage
who.getBasePackageName()
パッケージ名の適用
intent
intent
 
resolvedType
intent.resolveTypeIfNeeded (who.getContentResolver())
intentのcomponentが空でない場合は、ここでintentのmTypeフィールドを返し、nullと理解すればよい
resultTo
token
Binder,ActivityのmTokenフィールド,リモートActivity Recordのローカル識別
resultWho
target != null ? target.mEmbeddedID : null
mEmbeddedIDフィールドは、Activity Threadの内部クラスActivity ClientRecordクラスのembededIdフィールドから来ており、ローカルメンテナンスacitivityのIDが適用されると理解できる
requestCode
requestCode
設定しない場合は、デフォルトは-1です.
startFlags
0
 
profilerInfo
null
 
bOptions
options
 
resultToとresultWhoの2つのパラメータ.名前にはresultが含まれていますが、ジャンプするターゲットacticityを表すものではありません.startActivity ForResultを識別するために使用されます.requestcode>0を設定すると、ジャンプしたActivityから戻り値を取得してこのソースActivityに戻る必要がある場合、現在のソースActivityの識別と記録が必要になります.