继 Android应用程序(activity)启动过程(一),主要讲新进程和activity如何启动
yipianfengye_activity启动流程

  1. 从 第14步骤 调用 ActivityStack resumeTopActivityInnerLocked方法中最后面有一个方法startSpecificActivityLocked()。
 if (!next.hasBeenLaunched) {                next.hasBeenLaunched = true;            } else {                if (SHOW_APP_STARTING_PREVIEW) {                    next.showStartingWindow(null /* prev */, false /* newTask */,                            false /* taskSwich */);                }                if (DEBUG_SWITCH) Slog.v(TAG_SWITCH, "Restarting: " + next);            }            if (DEBUG_STATES) Slog.d(TAG_STATES, "resumeTopActivityLocked: Restarting " + next);            // 开始启动新 activity            mStackSupervisor.startSpecificActivityLocked(next, true, true);
  1. 在startSpecificActivityLocked()判断当前Activity所需要的应用进程是否已经启动,若启动的话,则直接调用realStartAtivityLocked方法,否则调用startProcessLocked方法,用于启动应用进程
void startSpecificActivityLocked(ActivityRecord r,            boolean andResume, boolean checkConfig) {        // Is this activity's application already running?        ProcessRecord app = mService.getProcessRecordLocked(r.processName,                r.info.applicationInfo.uid, true);        r.getStack().setLaunchTime(r);        if (app != null && app.thread != null) {            try {                if ((r.info.flags&ActivityInfo.FLAG_MULTIPROCESS) == 0                        || !"android".equals(r.info.packageName)) {                    app.addPackage(r.info.packageName, r.info.applicationInfo.versionCode,                            mService.mProcessStats);                }                // 进程已经启动                realStartActivityLocked(r, app, andResume, checkConfig);                return;            } catch (RemoteException e) {                Slog.w(TAG, "Exception when starting activity "                        + r.intent.getComponent().flattenToShortString(), e);            }            // If a dead object exception was thrown -- fall through to            // restart the application.        }        mService.startProcessLocked(r.processName, r.info.applicationInfo, true, 0,                "activity", r.intent.getComponent(), false, false, true);    }
  1. 先查看进程未启动的情况 进入ActivityManagerService.startProcessLocked()
    经过两次的方法重写,可以看到下面一段代码,在start()时传入了android.app.ActivityThread字符串,正式启动一个新进程
if (entryPoint == null) entryPoint = "android.app.ActivityThread";            Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "Start proc: " +                    app.processName);            checkTime(startTime, "startProcess: asking zygote to start proc");            Process.ProcessStartResult startResult = Process.start(entryPoint,                    app.processName, uid, uid, gids, debugFlags, mountExternal,                    app.info.targetSdkVersion, app.info.seinfo, requiredAbi, instructionSet,                    app.info.dataDir, entryPointArgs);
  1. 在Process.start()中 代码很简单,直接进入到startViaZygote() 翻译:开始孵化?
 try {            return startViaZygote(processClass, niceName, uid, gid, gids,                    debugFlags, mountExternal, targetSdkVersion, seInfo,                    abi, instructionSet, appDataDir, zygoteArgs);        } catch (ZygoteStartFailedEx ex) {            Log.e(LOG_TAG,                    "Starting VM process through Zygote failed");            throw new RuntimeException(                    "Starting VM process through Zygote failed", ex);        }
  1. 在startViaZygote()方法中又直接调用了zygoteSendArgsAndGetResult();
private static ProcessStartResult zygoteSendArgsAndGetResult(            ZygoteState zygoteState, ArrayList args)            throws ZygoteStartFailedEx {        try {            // Throw early if any of the arguments are malformed. This means we can            // avoid writing a partial response to the zygote.            int sz = args.size();            for (int i = 0; i < sz; i++) {                if (args.get(i).indexOf('\n') >= 0) {                    throw new ZygoteStartFailedEx("embedded newlines not allowed");                }            }            final BufferedWriter writer = zygoteState.writer;            final DataInputStream inputStream = zygoteState.inputStream;            writer.write(Integer.toString(args.size()));            writer.newLine();            for (int i = 0; i < sz; i++) {                String arg = args.get(i);                writer.write(arg);                writer.newLine();            }            writer.flush();            // Should there be a timeout on this?            ProcessStartResult result = new ProcessStartResult();            // Always read the entire result from the input stream to avoid leaving            // bytes in the stream for future process starts to accidentally stumble            // upon.            result.pid = inputStream.readInt();            result.usingWrapper = inputStream.readBoolean();            if (result.pid < 0) {                throw new ZygoteStartFailedEx("fork() failed");            }            return result;        } catch (IOException ex) {            zygoteState.close();            throw new ZygoteStartFailedEx(ex);        }    }

可以发现其最终调用了Zygote并通过socket通信的方式让Zygote进程fork除了一个新的进程,并根据我们刚刚传递的"android.app.ActivityThread"字符串,反射出该对象并执行ActivityThread的main方法。这样我们所要启动的应用进程这时候其实已经启动了,但是还没有执行相应的初始化操作。
43. 通过 openZygoteSocketIfNeeded()---->ZygoteState.connect()---->zygoteSocket.connect()---->impl.connect(),调用Native方法connectLocal()。具体进程怎么启动的这又是一个话题。。。
44. 当进程启动完成后就进入ActivityThread类的main方法

public static void main(String[] args) {        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");... ...        EventLogger.setReporter(new EventLoggingReporter());        ... ...        Process.setArgV0("");        Looper.prepareMainLooper();        ActivityThread thread = new ActivityThread();        thread.attach(false);        if (sMainThreadHandler == null) {            sMainThreadHandler = thread.getHandler();        }        if (false) {            Looper.myLooper().setMessageLogging(new                    LogPrinter(Log.DEBUG, "ActivityThread"));        }       ... ...        Looper.loop();        throw new RuntimeException("Main thread loop unexpectedly exited");    }
  1. 在main方法中调用了Looper.prepareMainLooper(); Looper.loop();方法,这就是为什么在activity(主线程)直接new handler,使用handler不报错的原因,在子线程要先调用prepare方法。下面是主要方法 thread.attach(false);
final IActivityManager mgr = ActivityManagerNative.getDefault();            try {                mgr.attachApplication(mAppThread);            } catch (RemoteException ex) {                throw ex.rethrowFromSystemServer();            }
  1. 通过ActivityManagerNative中ActivityManagerProxy的attachApplication方法发送到服务端,ActivityManagerNative的实现类ActivityManagerService中attachApplication()
    @Override    public final void attachApplication(IApplicationThread thread) {        synchronized (this) {            int callingPid = Binder.getCallingPid();            final long origId = Binder.clearCallingIdentity();            attachApplicationLocked(thread, callingPid);            Binder.restoreCallingIdentity(origId);        }    }
  1. 代码很简洁,直接进入attachApplicationLocked
  // See if the top visible activity is waiting to run in this process...        if (normalMode) {            try {                if (mStackSupervisor.attachApplicationLocked(app)) {                    didSomething = true;                }            } catch (Exception e) {                Slog.wtf(TAG, "Exception thrown launching activities in " + app, e);                badApp = true;            }        }
  1. 摸索到了这一段代码 mStackSupervisor.attachApplicationLocked(app)
    boolean attachApplicationLocked(ProcessRecord app) throws RemoteException {        final String processName = app.processName;        boolean didSomething = false;        for (int displayNdx = mActivityDisplays.size() - 1; displayNdx >= 0; --displayNdx) {            ArrayList stacks = mActivityDisplays.valueAt(displayNdx).mStacks;            for (int stackNdx = stacks.size() - 1; stackNdx >= 0; --stackNdx) {                final ActivityStack stack = stacks.get(stackNdx);                if (!isFocusedStack(stack)) {                    continue;                }                ActivityRecord hr = stack.topRunningActivityLocked();                if (hr != null) {                    if (hr.app == null && app.uid == hr.info.applicationInfo.uid                            && processName.equals(hr.processName)) {                        try {                            if (realStartActivityLocked(hr, app, true, true)) {                                didSomething = true;                            }                        } catch (RemoteException e) {                            Slog.w(TAG, "Exception in new application when starting activity "                                  + hr.intent.getComponent().flattenToShortString(), e);                            throw e;                        }                    }                }            }        }        if (!didSomething) {            ensureActivitiesVisibleLocked(null, 0, !PRESERVE_WINDOWS);        }        return didSomething;    }
  1. 我又重新看到了realStartActivityLocked(),又找到了组织,重新回到 step.39。这时候就是开始启动activity了
app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,                    System.identityHashCode(r), r.info, new Configuration(mService.mConfiguration),                    new Configuration(task.mOverrideConfig), r.compat, r.launchedFromPackage,                    task.voiceInteractor, app.repProcState, r.icicle, r.persistentState, results,                    newIntents, !andResume, mService.isNextTransitionForward(), profilerInfo);
  1. 通过IApplicationThread调用了scheduleLaunchActivity,最终实现是在ActivityThread内部类ApplicationThread实现的,然后通过Handler调用handleLaunchActivity()
case LAUNCH_ACTIVITY: {                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStart");                    final ActivityClientRecord r = (ActivityClientRecord) msg.obj;                    r.packageInfo = getPackageInfoNoCheck(                            r.activityInfo.applicationInfo, r.compatInfo);                    handleLaunchActivity(r, null, "LAUNCH_ACTIVITY");                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                } break;
  1. ActivityThread类 handleLaunchActivity 中有performLaunchActivity,handleResumeActivity,performPauseActivityIfNeeded
 private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {... ...        Activity a = performLaunchActivity(r, customIntent);        if (a != null) {            r.createdConfig = new Configuration(mConfiguration);            reportSizeConfigurations(r);            Bundle oldState = r.state;            ... ...            handleResumeActivity(r.token, false, r.isForward,                    !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);            if (!r.activity.mFinished && r.startsNotResumed) {               ... ...                performPauseActivityIfNeeded(r, reason);                .. ..                if (r.isPreHoneycomb()) {                    r.state = oldState;                }            }        } else {                      try {                ActivityManagerNative.getDefault()                    .finishActivity(r.token, Activity.RESULT_CANCELED, null,                            Activity.DONT_FINISH_TASK_WITH_ACTIVITY);            } catch (RemoteException ex) {                throw ex.rethrowFromSystemServer();            }        }    }
  1. performLaunchActivity中主要代码,newActivity(),通过类加载机制创建activity
try {            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();            activity = mInstrumentation.newActivity(                    cl, component.getClassName(), r.intent);            StrictMode.incrementExpectedActivityCount(activity.getClass());            r.intent.setExtrasClassLoader(cl);            r.intent.prepareToEnterProcess();            if (r.state != null) {                r.state.setClassLoader(cl);            }        } // 创建Activity通过类加载机制    public Activity newActivity(ClassLoader cl, String className,            Intent intent)            throws InstantiationException, IllegalAccessException,            ClassNotFoundException {        return (Activity)cl.loadClass(className).newInstance();    }
  1. 还是当前方法,开始activity onCreate方法
activity.mCalled = false;                if (r.isPersistable()) {                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);                } else {                    mInstrumentation.callActivityOnCreate(activity, r.state);                }
  1. 直接进入Instrumentation,
    public void callActivityOnCreate(Activity activity, Bundle icicle) {        prePerformCreate(activity);        activity.performCreate(icicle);        postPerformCreate(activity);    }// Activity      final void performCreate(Bundle icicle) {        restoreHasCurrentPermissionRequest(icicle);        onCreate(icicle);        mActivityTransitionState.readState(icicle);        performCreateCommon();    }
  1. 紧接着下面四五行代码,进入onstart()
if (!r.activity.mFinished) {                    activity.performStart();                    r.stopped = false;                }
  1. 恢复activity 被回收时保存的数据
if (!r.activity.mFinished) {                    if (r.isPersistable()) {                        if (r.state != null || r.persistentState != null) {                            mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state,                                    r.persistentState);                        }                    } else if (r.state != null) {                        mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);                    }                }                if (!r.activity.mFinished) {                    activity.mCalled = false;                    if (r.isPersistable()) {                    // 活动启动完成时调用(在{@link #onStart}和{@link #onRestoreInstanceState}调用之后)。                    应用程序通常不会实现这种方法;它用于系统类在应用程序代码运行之后进行最终初始化。,                        mInstrumentation.callActivityOnPostCreate(activity, r.state,                                r.persistentState);                    } else {                        mInstrumentation.callActivityOnPostCreate(activity, r.state);                    }                    if (!activity.mCalled) {                        throw new SuperNotCalledException(                            "Activity " + r.intent.getComponent().toShortString() +                            " did not call through to super.onPostCreate()");                    }                }
  1. 返回step 52 进入 handleResumeActivity,流程基本一样我就不往下分析了,现在及完成了activity onDestory到onCreate所有生命周期,祝大家收货满满!

更多相关文章

  1. 整理android环境离线安装搭建方法——支持android 2.3.3和androi
  2. android查询软件(身份证号,号码归属等)源代码
  3. FregServer进程,发送BC_TRANSACTION,唤醒ServiceManager进程,返回BR
  4. Android电话拨号器实现方法
  5. android Java代码的启动
  6. Android 代码设置来电铃声
  7. Android:UI更新方法四:在Worker Thread中runOnUiThread直接刷新U
  8. Android 获取屏幕高宽度,密度,通知栏高度,截图等常用方法

随机推荐

  1. Android学习笔记(九)
  2. Android 开发中怎么使用自定义字体?
  3. Android GreenDao3.2配置及使用详解
  4. windows上 android 21.1版本ADT环境搭建
  5. Android View — Gradient 渐变
  6. Android The SourceSet 'instrumentTest'
  7. Android 网上学习工具网址
  8. Android MQTT
  9. Android实现固定屏幕显示的方法
  10. Android应用程序UI硬件加速渲染的Display