App 시작 (3) Activity 작성

앞에서 말했듯이 AMS는 원격 호출attachApplication 방법에 의해 attachApplicationLocked 방법에서 원격 호출ApplicationThreadbindApplication 창설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를 만들었고 mStackSupervisorActivityStackSupervisor 유형의 대상입니다. 다음은 이 방법의 원본 코드를 보십시오.
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 메커니즘을 통해 원격으로 ApplicationThreadscheduleLaunchActivity 방법을 호출하여 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창설ActivityperformLaunchActivity방법사용mInstrumentation호출ActivityonCreate생명주기

좋은 웹페이지 즐겨찾기