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;
}
다음 방법
realStartActivityLockedfinal 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에 따라 라이센스가 부여됩니다.