App 시작 (3) Activity 작성
24141 단어 Android원본 코드시스템 소스 코드AMSActivity 작성
attachApplication
방법에 의해 attachApplicationLocked
방법에서 원격 호출ApplicationThread
된bindApplication
창설Application
대상을 원격 호출한다.실제로 attachApplicationLocked
방법은 Application
대상의 창설을 진행하는 것이 아니라 Application
대상을 창설한 후에 Activity
의 창설도 진행했다. 이번에는 그 원본을 좀 더 보겠습니다.1.
ActivityManagerService
# attachApplicationLocked
private final boolean attachApplicationLocked(IApplicationThread thread,
int pid) {
......
try {
......
//1. Application
thread.bindApplication(...);
......
} catch (Exception e) {
......
return false;
}
......
if (normalMode) {
try {
//2. activity
if (mStackSupervisor.attachApplicationLocked(app)) {
didSomething = true;
}
} catch (Exception e) {
...
}
}
......
return true;
}
mStackSupervisor.attachApplicationLocked(app)
방법으로 Activity
를 만들었고 mStackSupervisor
는 ActivityStackSupervisor
유형의 대상입니다. 다음은 이 방법의 원본 코드를 보십시오.boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {
...
try {
// realStartActivityLocked activity
if (realStartActivityLocked(hr, app, true, true)) {
didSomething = true;
}
} catch (RemoteException e) {
...
}
...
return didSomething;
}
다음 방법
realStartActivityLocked
final boolean realStartActivityLocked(ActivityRecord r,
ProcessRecord app, boolean andResume, boolean checkConfig)
throws RemoteException {
......
try {
......
app.thread.scheduleLaunchActivity(...);
......
} catch (RemoteException e) {
......
}
......
return true;
}
마지막으로 호출
app.thread.scheduleLaunchActivity
방법으로 창설Activity
한 것을 볼 수 있다. app.thread
는앞에서 말한
mAppThread
대상의 Binder 에이전트 대상, 즉 이때 AMS는 Binder 메커니즘을 통해 원격으로 ApplicationThread
의scheduleLaunchActivity
방법을 호출하여 Activity
창설을 진행했다.2.
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) {
...
// H mH
sendMessage(H.LAUNCH_ACTIVITY, r);
}
Application의 창설과 마찬가지로Handler 메커니즘을 통해
H.LAUNCH_ACTIVITY
메시지를 H
클래스에 전달하여 분배 처리를 하였으나 실제로H
클래스는 이를 ActivityThread
클래스에 전달하는handleLaunchActivity
방법으로 처리하였다.3.
ActivityThread
# handleLaunchActivity
private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
//1. Activity oncreate
Activity a = performLaunchActivity(r, customIntent);
if (a != null) {
......
//2. Activity onResume
handleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed);
......
} else {
......
}
}
실제 Activity 생성은
performLaunchActivity
방법으로 처리됩니다.private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
......
Activity activity = null;
try {
...
//1. activity
activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);
...
} catch (Exception e) {
...
}
try {
//2. Application, Application , Application
Application app = r.packageInfo.makeApplication(false, mInstrumentation);
......
if (activity != null) {
//3. context
Context appContext = createBaseContextForActivity(r, activity);
......
//4. Context Application activity , activity
activity.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);
//5. activity oncreate
if (r.isPersistable()) {
mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);
} else {
mInstrumentation.callActivityOnCreate(activity, r.state);
}
......
} catch (SuperNotCalledException e) {
...
}
return activity;
}
실제 창설
Activity
여기는 Instrumentation
의 대상이고, mInstrumentation.newActivity
방법은newApplication
방법과 같이 반사로 생성Activity
창설Activity
후performLaunchActivity
방법사용mInstrumentation
호출Activity
성onCreate
생명주기
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Bitrise에서 배포 어플리케이션 설정 테스트하기이 글은 Bitrise 광고 달력의 23일째 글입니다. 자체 또는 당사 등에서 Bitrise 구축 서비스를 사용합니다. 그나저나 며칠 전 Bitrise User Group Meetup #3에서 아래 슬라이드를 발표했...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.