android 28 startActivity起動プロセス分析(一)--ローカルからAMS呼び出しパラメータ照合
2419 ワード
ユーザーコールActivity:startActivity()---->Activity:startActivity ForResult()-->Instrumentation:execStartActivity()-->リモートAMS
Instrumentation.java
ActivityManagerServicesを呼び出します.java
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の識別と記録が必要になります.
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の識別と記録が必要になります.