大家初学java时候都知道java的程序入口是从main方法进入,那么Android是基于java编写的,那Android的程序入口做了哪些操作呢?还有Android的应用程序到底是怎样启动的呢?我们一起来看一下.

首先附上ActivityThread.java的main方法:

public static void main(String[] args) {        Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");         SamplingProfilerIntegration.start();         // CloseGuard defaults to true and can be quite spammy.  We        // disable it here, but selectively enable it later (via        // StrictMode) on debug builds, but using DropBox, not logs.        CloseGuard.setEnabled(false);        Environment.initForCurrentUser();        // Set the reporter for event logging in libcore        EventLogger.setReporter(new EventLoggingReporter());        AndroidKeyStoreProvider.install();        // Make sure TrustedCertificateStore looks in the right place for CA certificates        final File configDir = Environment.getUserConfigDirectory(UserHandle.myUserId());        TrustedCertificateStore.setDefaultUserDirectory(configDir);        Process.setArgV0("");        Looper.prepareMainLooper(); //实例化Looper并设置到ThreadLocal里面,赋值MainLooper                ActivityThread thread = new ActivityThread();  //实例化一个ActivityThread        thread.attach(false);      //主要是获取AMS接口 然后设置ApplicationThread 的接口 给AMS和应用程序通信        if (sMainThreadHandler == null) {                sMainThreadHandler = thread.getHandler();  //设置MainHandler 是一些接受生命周期的方法        }        if (false) {             Looper.myLooper().setMessageLogging(new                    LogPrinter(Log.DEBUG, "ActivityThread"));        }        // End of event ActivityThreadMain.        Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);        Looper.loop();  //开始接收消息        throw new RuntimeException("Main thread loop unexpectedly exited");    }

首先我们看第23行:

Looper.prepareMainLooper();

做Android的都知道Looper是handler机制的一个组件

(那么这里就延伸了一个问题,子线程里面能不能创建Handler呢?答案是可以的,但是必须要创建Looper,那么就有人问了,为什么主线程里面不用创建呢?看了Android的代码以后知道了,原来Android已经默默的给创建好了,Android的组件的生命周期也都是由Handler来调用的,下面就会看到)

那么我们来看一下prepareMainLooper()都做了一些什么事情:

public static void prepareMainLooper() {        prepare(false);        synchronized (Looper.class) {            if (sMainLooper != null) {                throw new IllegalStateException("The main Looper has already been prepared.");            }            sMainLooper = myLooper();        }}
private static void prepare(boolean quitAllowed) {        if (sThreadLocal.get() != null) {            throw new RuntimeException("Only one Looper may be created per thread");        }        sThreadLocal.set(new Looper(quitAllowed));}
/**     * Return the Looper object associated with the current thread.  Returns     * null if the calling thread is not associated with a Looper.     */    public static @Nullable Looper myLooper() {        return sThreadLocal.get();}

private Looper(boolean quitAllowed) {        mQueue = new MessageQueue(quitAllowed);        mThread = Thread.currentThread();}


好大家看进入了prepareMainLooper以后首先调用了prepare方法,在prepare方法里面判断了sThreadLocal!=null以后才往下走,这就解释了一个线程只能有一个Looper,实例化了一个Looper并设置给sThreadLocal,那么看到Looper的构造方法里面创建了MessageQueue一个消息队列和获取当前的线程Thread并赋值.

然后在prepareMainLooper下面又执行了一句代码把刚才创建的Looper赋值给sMainLooper.

(这个sMainLooper就是主线程的Looper也就是UI线程的Looper,在开发Android应用时有时也会获取它和当前线程的Looper比较,可以知道当前是不是在主线程....额...有点跑题了)

那么这段代码就结束了,我们继续往下看.

第25行实例化了ActivityThread对象:

第26行调用了AcitivityThread对象的attach方法,那么来看一下究竟做了什么:

private void attach(boolean system) {        sCurrentActivityThread = this;        mSystemThread = system;        if (!system) {            ViewRootImpl.addFirstDrawHandler(new Runnable() {                @Override                public void run() {                    ensureJitEnabled();                }            });            android.ddm.DdmHandleAppName.setAppName("",                                                    UserHandle.myUserId());            RuntimeInit.setApplicationObject(mAppThread.asBinder());            final IActivityManager mgr = ActivityManagerNative.getDefault();            try {                mgr.attachApplication(mAppThread);            } catch (RemoteException ex) {                // Ignore            }            // Watch for getting close to heap limit.            BinderInternal.addGcWatcher(new Runnable() {                @Override public void run() {                    if (!mSomeActivitiesChanged) {                        return;                    }                    Runtime runtime = Runtime.getRuntime();                    long dalvikMax = runtime.maxMemory();                    long dalvikUsed = runtime.totalMemory() - runtime.freeMemory();                    if (dalvikUsed > ((3*dalvikMax)/4)) {                        if (DEBUG_MEMORY_TRIM) Slog.d(TAG, "Dalvik max=" + (dalvikMax/1024)                                + " total=" + (runtime.totalMemory()/1024)                                + " used=" + (dalvikUsed/1024));                        mSomeActivitiesChanged = false;                        try {                            mgr.releaseSomeActivities(mAppThread);                        } catch (RemoteException e) {                        }                    }                }            });        } else {            // Don't set application object here -- if the system crashes,            // we can't display an alert, we just want to die die die.            android.ddm.DdmHandleAppName.setAppName("system_process",                    UserHandle.myUserId());            try {                mInstrumentation = new Instrumentation();                ContextImpl context = ContextImpl.createAppContext(                        this, getSystemContext().mPackageInfo);                mInitialApplication = context.mPackageInfo.makeApplication(true, null);                mInitialApplication.onCreate();            } catch (Exception e) {                throw new RuntimeException(                        "Unable to instantiate Application():" + e.toString(), e);            }        }        // add dropbox logging to libcore        DropBox.setReporter(new DropBoxReporter());        ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {            @Override            public void onConfigurationChanged(Configuration newConfig) {                synchronized (mResourcesManager) {                    // We need to apply this change to the resources                    // immediately, because upon returning the view                    // hierarchy will be informed about it.                    if (mResourcesManager.applyConfigurationToResourcesLocked(newConfig, null)) {                        // This actually changed the resources!  Tell                        // everyone about it.                        if (mPendingConfiguration == null ||                                mPendingConfiguration.isOtherSeqNewer(newConfig)) {                            mPendingConfiguration = newConfig;                            sendMessage(H.CONFIGURATION_CHANGED, newConfig);                        }                    }                }            }            @Override            public void onLowMemory() {            }            @Override            public void onTrimMemory(int level) {            }        });}
调用的时候参数传递false说明不是系统调用的,那么我们就看if语句块里面的,主要就看14行和16行的代码:

 final IActivityManager mgr = ActivityManagerNative.getDefault();        
 mgr.attachApplication(mAppThread);

那么这两句代码首先Android系统中存在一个ActivityManagerService(简称AMS)(大白话就叫Activity管理服务),他是来调度Android程序里面的Activity的开启等工作.

那么ActivityManagerNative.getDefault()就是获取了这个ActivityManagerService的Binder接口(Binder:跨进程通信),然后调用了attachApplication传入了一个mAppThread.

那么这个mAppThread是什么呢?

它是ApplicationThread在全局声明并初始化,这个东西也是一个继承了Binder的类,把他传递给AMS,以后AMS就拿这个东西和应用程序进行通信.
            

然后再回到ActivityThread的代码中,设置了一个sMainThreadHandler,这个thread.getHandler()方法返回了一个名为H的继承自Handler的一个类:

private class H extends Handler {        public static final int LAUNCH_ACTIVITY         = 100;        public static final int PAUSE_ACTIVITY          = 101;        public static final int PAUSE_ACTIVITY_FINISHING= 102;        public static final int STOP_ACTIVITY_SHOW      = 103;        public static final int STOP_ACTIVITY_HIDE      = 104;        public static final int SHOW_WINDOW             = 105;        public static final int HIDE_WINDOW             = 106;        public static final int RESUME_ACTIVITY         = 107;        public static final int SEND_RESULT             = 108;        public static final int DESTROY_ACTIVITY        = 109;        public static final int BIND_APPLICATION        = 110;        public static final int EXIT_APPLICATION        = 111;        public static final int NEW_INTENT              = 112;        public static final int RECEIVER                = 113;        public static final int CREATE_SERVICE          = 114;        public static final int SERVICE_ARGS            = 115;        public static final int STOP_SERVICE            = 116;        public static final int CONFIGURATION_CHANGED   = 118;        public static final int CLEAN_UP_CONTEXT        = 119;        public static final int GC_WHEN_IDLE            = 120;        public static final int BIND_SERVICE            = 121;        public static final int UNBIND_SERVICE          = 122;        public static final int DUMP_SERVICE            = 123;        public static final int LOW_MEMORY              = 124;        public static final int ACTIVITY_CONFIGURATION_CHANGED = 125;        public static final int RELAUNCH_ACTIVITY       = 126;        public static final int PROFILER_CONTROL        = 127;        public static final int CREATE_BACKUP_AGENT     = 128;        public static final int DESTROY_BACKUP_AGENT    = 129;        public static final int SUICIDE                 = 130;        public static final int REMOVE_PROVIDER         = 131;        public static final int ENABLE_JIT              = 132;        public static final int DISPATCH_PACKAGE_BROADCAST = 133;        public static final int SCHEDULE_CRASH          = 134;        public static final int DUMP_HEAP               = 135;        public static final int DUMP_ACTIVITY           = 136;        public static final int SLEEPING                = 137;        public static final int SET_CORE_SETTINGS       = 138;        public static final int UPDATE_PACKAGE_COMPATIBILITY_INFO = 139;        public static final int TRIM_MEMORY             = 140;        public static final int DUMP_PROVIDER           = 141;        public static final int UNSTABLE_PROVIDER_DIED  = 142;        public static final int REQUEST_ASSIST_CONTEXT_EXTRAS = 143;        public static final int TRANSLUCENT_CONVERSION_COMPLETE = 144;        public static final int INSTALL_PROVIDER        = 145;        public static final int ON_NEW_ACTIVITY_OPTIONS = 146;        public static final int CANCEL_VISIBLE_BEHIND = 147;        public static final int BACKGROUND_VISIBLE_BEHIND_CHANGED = 148;        public static final int ENTER_ANIMATION_COMPLETE = 149;        String codeToString(int code) {            if (DEBUG_MESSAGES) {                switch (code) {                    case LAUNCH_ACTIVITY: return "LAUNCH_ACTIVITY";                    case PAUSE_ACTIVITY: return "PAUSE_ACTIVITY";                    case PAUSE_ACTIVITY_FINISHING: return "PAUSE_ACTIVITY_FINISHING";                    case STOP_ACTIVITY_SHOW: return "STOP_ACTIVITY_SHOW";                    case STOP_ACTIVITY_HIDE: return "STOP_ACTIVITY_HIDE";                    case SHOW_WINDOW: return "SHOW_WINDOW";                    case HIDE_WINDOW: return "HIDE_WINDOW";                    case RESUME_ACTIVITY: return "RESUME_ACTIVITY";                    case SEND_RESULT: return "SEND_RESULT";                    case DESTROY_ACTIVITY: return "DESTROY_ACTIVITY";                    case BIND_APPLICATION: return "BIND_APPLICATION";                    case EXIT_APPLICATION: return "EXIT_APPLICATION";                    case NEW_INTENT: return "NEW_INTENT";                    case RECEIVER: return "RECEIVER";                    case CREATE_SERVICE: return "CREATE_SERVICE";                    case SERVICE_ARGS: return "SERVICE_ARGS";                    case STOP_SERVICE: return "STOP_SERVICE";                    case CONFIGURATION_CHANGED: return "CONFIGURATION_CHANGED";                    case CLEAN_UP_CONTEXT: return "CLEAN_UP_CONTEXT";                    case GC_WHEN_IDLE: return "GC_WHEN_IDLE";                    case BIND_SERVICE: return "BIND_SERVICE";                    case UNBIND_SERVICE: return "UNBIND_SERVICE";                    case DUMP_SERVICE: return "DUMP_SERVICE";                    case LOW_MEMORY: return "LOW_MEMORY";                    case ACTIVITY_CONFIGURATION_CHANGED: return "ACTIVITY_CONFIGURATION_CHANGED";                    case RELAUNCH_ACTIVITY: return "RELAUNCH_ACTIVITY";                    case PROFILER_CONTROL: return "PROFILER_CONTROL";                    case CREATE_BACKUP_AGENT: return "CREATE_BACKUP_AGENT";                    case DESTROY_BACKUP_AGENT: return "DESTROY_BACKUP_AGENT";                    case SUICIDE: return "SUICIDE";                    case REMOVE_PROVIDER: return "REMOVE_PROVIDER";                    case ENABLE_JIT: return "ENABLE_JIT";                    case DISPATCH_PACKAGE_BROADCAST: return "DISPATCH_PACKAGE_BROADCAST";                    case SCHEDULE_CRASH: return "SCHEDULE_CRASH";                    case DUMP_HEAP: return "DUMP_HEAP";                    case DUMP_ACTIVITY: return "DUMP_ACTIVITY";                    case SLEEPING: return "SLEEPING";                    case SET_CORE_SETTINGS: return "SET_CORE_SETTINGS";                    case UPDATE_PACKAGE_COMPATIBILITY_INFO: return "UPDATE_PACKAGE_COMPATIBILITY_INFO";                    case TRIM_MEMORY: return "TRIM_MEMORY";                    case DUMP_PROVIDER: return "DUMP_PROVIDER";                    case UNSTABLE_PROVIDER_DIED: return "UNSTABLE_PROVIDER_DIED";                    case REQUEST_ASSIST_CONTEXT_EXTRAS: return "REQUEST_ASSIST_CONTEXT_EXTRAS";                    case TRANSLUCENT_CONVERSION_COMPLETE: return "TRANSLUCENT_CONVERSION_COMPLETE";                    case INSTALL_PROVIDER: return "INSTALL_PROVIDER";                    case ON_NEW_ACTIVITY_OPTIONS: return "ON_NEW_ACTIVITY_OPTIONS";                    case CANCEL_VISIBLE_BEHIND: return "CANCEL_VISIBLE_BEHIND";                    case BACKGROUND_VISIBLE_BEHIND_CHANGED: return "BACKGROUND_VISIBLE_BEHIND_CHANGED";                    case ENTER_ANIMATION_COMPLETE: return "ENTER_ANIMATION_COMPLETE";                }            }            return Integer.toString(code);        }        public void handleMessage(Message msg) {            if (DEBUG_MESSAGES) Slog.v(TAG, ">>> handling: " + codeToString(msg.what));            switch (msg.what) {                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);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                } break;                case RELAUNCH_ACTIVITY: {                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityRestart");                    ActivityClientRecord r = (ActivityClientRecord)msg.obj;                    handleRelaunchActivity(r);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                } break;                case PAUSE_ACTIVITY:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");                    handlePauseActivity((IBinder)msg.obj, false, (msg.arg1&1) != 0, msg.arg2,                            (msg.arg1&2) != 0);                    maybeSnapshot();                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case PAUSE_ACTIVITY_FINISHING:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityPause");                    handlePauseActivity((IBinder)msg.obj, true, (msg.arg1&1) != 0, msg.arg2,                            (msg.arg1&1) != 0);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case STOP_ACTIVITY_SHOW:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");                    handleStopActivity((IBinder)msg.obj, true, msg.arg2);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case STOP_ACTIVITY_HIDE:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityStop");                    handleStopActivity((IBinder)msg.obj, false, msg.arg2);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SHOW_WINDOW:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityShowWindow");                    handleWindowVisibility((IBinder)msg.obj, true);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case HIDE_WINDOW:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityHideWindow");                    handleWindowVisibility((IBinder)msg.obj, false);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case RESUME_ACTIVITY:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityResume");                    handleResumeActivity((IBinder) msg.obj, true, msg.arg1 != 0, true);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SEND_RESULT:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDeliverResult");                    handleSendResult((ResultData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case DESTROY_ACTIVITY:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityDestroy");                    handleDestroyActivity((IBinder)msg.obj, msg.arg1 != 0,                            msg.arg2, false);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case BIND_APPLICATION:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "bindApplication");                    AppBindData data = (AppBindData)msg.obj;                    handleBindApplication(data);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case EXIT_APPLICATION:                    if (mInitialApplication != null) {                        mInitialApplication.onTerminate();                    }                    Looper.myLooper().quit();                    break;                case NEW_INTENT:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityNewIntent");                    handleNewIntent((NewIntentData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case RECEIVER:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastReceiveComp");                    handleReceiver((ReceiverData)msg.obj);                    maybeSnapshot();                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case CREATE_SERVICE:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceCreate");                    handleCreateService((CreateServiceData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case BIND_SERVICE:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceBind");                    handleBindService((BindServiceData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case UNBIND_SERVICE:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceUnbind");                    handleUnbindService((BindServiceData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SERVICE_ARGS:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStart");                    handleServiceArgs((ServiceArgsData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case STOP_SERVICE:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "serviceStop");                    handleStopService((IBinder)msg.obj);                    maybeSnapshot();                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case CONFIGURATION_CHANGED:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "configChanged");                    mCurDefaultDisplayDpi = ((Configuration)msg.obj).densityDpi;                    handleConfigurationChanged((Configuration)msg.obj, null);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case CLEAN_UP_CONTEXT:                    ContextCleanupInfo cci = (ContextCleanupInfo)msg.obj;                    cci.context.performFinalCleanup(cci.who, cci.what);                    break;                case GC_WHEN_IDLE:                    scheduleGcIdler();                    break;                case DUMP_SERVICE:                    handleDumpService((DumpComponentInfo)msg.obj);                    break;                case LOW_MEMORY:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "lowMemory");                    handleLowMemory();                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case ACTIVITY_CONFIGURATION_CHANGED:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "activityConfigChanged");                    handleActivityConfigurationChanged((ActivityConfigChangeData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case PROFILER_CONTROL:                    handleProfilerControl(msg.arg1 != 0, (ProfilerInfo)msg.obj, msg.arg2);                    break;                case CREATE_BACKUP_AGENT:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupCreateAgent");                    handleCreateBackupAgent((CreateBackupAgentData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case DESTROY_BACKUP_AGENT:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "backupDestroyAgent");                    handleDestroyBackupAgent((CreateBackupAgentData)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SUICIDE:                    Process.killProcess(Process.myPid());                    break;                case REMOVE_PROVIDER:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "providerRemove");                    completeRemoveProvider((ProviderRefCount)msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case ENABLE_JIT:                    ensureJitEnabled();                    break;                case DISPATCH_PACKAGE_BROADCAST:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "broadcastPackage");                    handleDispatchPackageBroadcast(msg.arg1, (String[])msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SCHEDULE_CRASH:                    throw new RemoteServiceException((String)msg.obj);                case DUMP_HEAP:                    handleDumpHeap(msg.arg1 != 0, (DumpHeapData)msg.obj);                    break;                case DUMP_ACTIVITY:                    handleDumpActivity((DumpComponentInfo)msg.obj);                    break;                case DUMP_PROVIDER:                    handleDumpProvider((DumpComponentInfo)msg.obj);                    break;                case SLEEPING:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "sleeping");                    handleSleeping((IBinder)msg.obj, msg.arg1 != 0);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case SET_CORE_SETTINGS:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "setCoreSettings");                    handleSetCoreSettings((Bundle) msg.obj);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case UPDATE_PACKAGE_COMPATIBILITY_INFO:                    handleUpdatePackageCompatibilityInfo((UpdateCompatibilityData)msg.obj);                    break;                case TRIM_MEMORY:                    Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "trimMemory");                    handleTrimMemory(msg.arg1);                    Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);                    break;                case UNSTABLE_PROVIDER_DIED:                    handleUnstableProviderDied((IBinder)msg.obj, false);                    break;                case REQUEST_ASSIST_CONTEXT_EXTRAS:                    handleRequestAssistContextExtras((RequestAssistContextExtras)msg.obj);                    break;                case TRANSLUCENT_CONVERSION_COMPLETE:                    handleTranslucentConversionComplete((IBinder)msg.obj, msg.arg1 == 1);                    break;                case INSTALL_PROVIDER:                    handleInstallProvider((ProviderInfo) msg.obj);                    break;                case ON_NEW_ACTIVITY_OPTIONS:                    Pair pair = (Pair) msg.obj;                    onNewActivityOptions(pair.first, pair.second);                    break;                case CANCEL_VISIBLE_BEHIND:                    handleCancelVisibleBehind((IBinder) msg.obj);                    break;                case BACKGROUND_VISIBLE_BEHIND_CHANGED:                    handleOnBackgroundVisibleBehindChanged((IBinder) msg.obj, msg.arg1 > 0);                    break;                case ENTER_ANIMATION_COMPLETE:                    handleEnterAnimationComplete((IBinder) msg.obj);                    break;            }            if (DEBUG_MESSAGES) Slog.v(TAG, "<<< done: " + codeToString(msg.what));        }        private void maybeSnapshot() {            if (mBoundApplication != null && SamplingProfilerIntegration.isEnabled()) {                // convert the *private* ActivityThread.PackageInfo to *public* known                // android.content.pm.PackageInfo                String packageName = mBoundApplication.info.mPackageName;                android.content.pm.PackageInfo packageInfo = null;                try {                    Context context = getSystemContext();                    if(context == null) {                        Log.e(TAG, "cannot get a valid context");                        return;                    }                    PackageManager pm = context.getPackageManager();                    if(pm == null) {                        Log.e(TAG, "cannot get a valid PackageManager");                        return;                    }                    packageInfo = pm.getPackageInfo(                            packageName, PackageManager.GET_ACTIVITIES);                } catch (NameNotFoundException e) {                    Log.e(TAG, "cannot get package info for " + packageName, e);                }                SamplingProfilerIntegration.writeSnapshot(mBoundApplication.processName, packageInfo);            }        }}
看着是不是很亲切,有PAUSE_ACTIVITY、STOP_ACTIVITY、BIND_SERVICE等,就看到了组件的声明周期都是通过这去发起的.

最后ActivityThread第39行,调用Looper.loop()方法开始循环获取Message.

完事了? 没了?  怎么可能.... 记不记得咱们给AMS设置了一个ApplicationThread,设置了以后AMS就说了,行了可以.

当AMS看我能调用到你了,好,你可以干你的事了,那么它会通过ApplicationThread告诉你,那么来看一下ApplicationThread的类:

private class ApplicationThread extends ApplicationThreadNative {        private static final String DB_INFO_FORMAT = "  %8s %8s %14s %14s  %s";        private int mLastProcessState = -1;        private void updatePendingConfiguration(Configuration config) {            synchronized (mResourcesManager) {                if (mPendingConfiguration == null ||                        mPendingConfiguration.isOtherSeqNewer(config)) {                    mPendingConfiguration = config;                }            }        }        public final void schedulePauseActivity(IBinder token, boolean finished,                boolean userLeaving, int configChanges, boolean dontReport) {            sendMessage(                    finished ? H.PAUSE_ACTIVITY_FINISHING : H.PAUSE_ACTIVITY,                    token,                    (userLeaving ? 1 : 0) | (dontReport ? 2 : 0),                    configChanges);        }        public final void scheduleStopActivity(IBinder token, boolean showWindow,                int configChanges) {           sendMessage(                showWindow ? H.STOP_ACTIVITY_SHOW : H.STOP_ACTIVITY_HIDE,                token, 0, configChanges);        }        public final void scheduleWindowVisibility(IBinder token, boolean showWindow) {            sendMessage(                showWindow ? H.SHOW_WINDOW : H.HIDE_WINDOW,                token);        }        public final void scheduleSleeping(IBinder token, boolean sleeping) {            sendMessage(H.SLEEPING, token, sleeping ? 1 : 0);        }        public final void scheduleResumeActivity(IBinder token, int processState,                boolean isForward, Bundle resumeArgs) {            updateProcessState(processState, false);            sendMessage(H.RESUME_ACTIVITY, token, isForward ? 1 : 0);        }        public final void scheduleSendResult(IBinder token, List results) {            ResultData res = new ResultData();            res.token = token;            res.results = results;            sendMessage(H.SEND_RESULT, res);        }        // we use token to identify this activity without having to send the        // activity itself back to the activity manager. (matters more with ipc)        @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 pendingResults, List pendingNewIntents,                boolean notResumed, boolean isForward, ProfilerInfo profilerInfo) {            updateProcessState(procState, false);            ActivityClientRecord r = new ActivityClientRecord();            r.token = token;            r.ident = ident;            r.intent = intent;            r.referrer = referrer;            r.voiceInteractor = voiceInteractor;            r.activityInfo = info;            r.compatInfo = compatInfo;            r.state = state;            r.persistentState = persistentState;            r.pendingResults = pendingResults;            r.pendingIntents = pendingNewIntents;            r.startsNotResumed = notResumed;            r.isForward = isForward;            r.profilerInfo = profilerInfo;            r.overrideConfig = overrideConfig;            updatePendingConfiguration(curConfig);            sendMessage(H.LAUNCH_ACTIVITY, r);        }        @Override        public final void scheduleRelaunchActivity(IBinder token,                List pendingResults, List pendingNewIntents,                int configChanges, boolean notResumed, Configuration config,                Configuration overrideConfig) {            requestRelaunchActivity(token, pendingResults, pendingNewIntents,                    configChanges, notResumed, config, overrideConfig, true);        }        public final void scheduleNewIntent(List intents, IBinder token) {            NewIntentData data = new NewIntentData();            data.intents = intents;            data.token = token;            sendMessage(H.NEW_INTENT, data);        }        public final void scheduleDestroyActivity(IBinder token, boolean finishing,                int configChanges) {            sendMessage(H.DESTROY_ACTIVITY, token, finishing ? 1 : 0,                    configChanges);}
那么这里贴出了ApplicationThread的部分代码,这个类很多,都是一些创建组件啊,和组件的暂停,销毁的一些声明周期,通过Binder机制调用了以后,在方法里面调用sendMessage()方法,最后会走到刚才H类的handleMessage方法做处理.

那么主要看一下scheduleLaunchActivity,从AMS传递过来一堆参数,都是Activity的一些信息,把他们都封装到了ActivityClientRecord对象里,然后调用sendMessage方法最终调用到handleMessage里面.

那么看H类的handleMessage的switch语句,第一个就是LAUNCH_ACTIVITY那么看一下handleLaunchActivity把ActivityClientRecord传递进去,看一下代码:

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent) {        // If we are getting ready to gc after going to the background, well        // we are back active so skip it.        unscheduleGcIdler();        mSomeActivitiesChanged = true;        if (r.profilerInfo != null) {            mProfiler.setProfiler(r.profilerInfo);            mProfiler.startProfiling();        }        // Make sure we are running with the most recent config.        handleConfigurationChanged(null, null);        if (localLOGV) Slog.v(            TAG, "Handling launch of " + r);        // Initialize before creating the activity        WindowManagerGlobal.initialize(); //创建Activity之前初始化全局窗口管理者        Activity a = performLaunchActivity(r, customIntent);   //获得一个Activity对象        if (a != null) {            r.createdConfig = new Configuration(mConfiguration);            Bundle oldState = r.state;            handleResumeActivity(r.token, false, r.isForward,                    !r.activity.mFinished && !r.startsNotResumed);            if (!r.activity.mFinished && r.startsNotResumed) {                // The activity manager actually wants this one to start out                // paused, because it needs to be visible but isn't in the                // foreground.  We accomplish this by going through the                // normal startup (because activities expect to go through                // onResume() the first time they run, before their window                // is displayed), and then pausing it.  However, in this case                // we do -not- need to do the full pause cycle (of freezing                // and such) because the activity manager assumes it can just                // retain the current state it has.                try {                    r.activity.mCalled = false;                    mInstrumentation.callActivityOnPause(r.activity);                    // We need to keep around the original state, in case                    // we need to be created again.  But we only do this                    // for pre-Honeycomb apps, which always save their state                    // when pausing, so we can not have them save their state                    // when restarting from a paused state.  For HC and later,                    // we want to (and can) let the state be saved as the normal                    // part of stopping the activity.                    if (r.isPreHoneycomb()) {                        r.state = oldState;                    }                    if (!r.activity.mCalled) {                        throw new SuperNotCalledException(                            "Activity " + r.intent.getComponent().toShortString() +                            " did not call through to super.onPause()");                    }                } catch (SuperNotCalledException e) {                    throw e;                } catch (Exception e) {                    if (!mInstrumentation.onException(r.activity, e)) {                        throw new RuntimeException(                                "Unable to pause activity "                                + r.intent.getComponent().toShortString()                                + ": " + e.toString(), e);                    }                }                r.paused = true;            }        } else {            // If there was an error, for any reason, tell the activity            // manager to stop us.            try {                ActivityManagerNative.getDefault()                    .finishActivity(r.token, Activity.RESULT_CANCELED, null, false);            } catch (RemoteException ex) {                // Ignore            }        }}
那么主要看一下performLaunchActivity把Activity信息传递进去获取了一个Activity对象,那么下面直接就调用resume了,那么也就是说在performLaunchActivity里面已经调用了onCreate和onStart了,看一下代码:

private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {        // System.out.println("##### [" + System.currentTimeMillis() + "] ActivityThread.performLaunchActivity(" + r + ")");        ActivityInfo aInfo = r.activityInfo; //Activity的信息,启动模式Theme 烂七八糟的        if (r.packageInfo == null) {            r.packageInfo = getPackageInfo(aInfo.applicationInfo, r.compatInfo,                    Context.CONTEXT_INCLUDE_CODE);        }        ComponentName component = r.intent.getComponent();  //应该就是完整的包名+类名         if (component == null) {            component = r.intent.resolveActivity(                mInitialApplication.getPackageManager());            r.intent.setComponent(component);        }        if (r.activityInfo.targetActivity != null) {            component = new ComponentName(r.activityInfo.packageName,                    r.activityInfo.targetActivity);        }        Activity activity = null;        try {            java.lang.ClassLoader cl = r.packageInfo.getClassLoader();            activity = mInstrumentation.newActivity(                    cl, component.getClassName(), r.intent);      //ClassLoader加载Activity类            StrictMode.incrementExpectedActivityCount(activity.getClass());            r.intent.setExtrasClassLoader(cl);            r.intent.prepareToEnterProcess();            if (r.state != null) {                r.state.setClassLoader(cl);            }        } catch (Exception e) {            if (!mInstrumentation.onException(activity, e)) {                throw new RuntimeException(                    "Unable to instantiate activity " + component                    + ": " + e.toString(), e);            }        }        try {            Application app = r.packageInfo.makeApplication(false, mInstrumentation);  //搞到Application            if (localLOGV) Slog.v(TAG, "Performing launch of " + r);            if (localLOGV) Slog.v(                    TAG, r + ": app=" + app                    + ", appName=" + app.getPackageName()                    + ", pkg=" + r.packageInfo.getPackageName()                    + ", comp=" + r.intent.getComponent().toShortString()                    + ", dir=" + r.packageInfo.getAppDir());            if (activity != null) {                Context appContext = createBaseContextForActivity(r, activity);                CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager()); //Lable                Configuration config = new Configuration(mCompatConfiguration);                if (DEBUG_CONFIGURATION) Slog.v(TAG, "Launching activity "                        + r.activityInfo.name + " with config " + config);                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);                if (customIntent != null) {                    activity.mIntent = customIntent;                }                r.lastNonConfigurationInstances = null;                activity.mStartedActivity = false;                int theme = r.activityInfo.getThemeResource();                if (theme != 0) {                    activity.setTheme(theme);                }                activity.mCalled = false;                if (r.isPersistable()) {                    mInstrumentation.callActivityOnCreate(activity, r.state, r.persistentState);                } else {                    mInstrumentation.callActivityOnCreate(activity, r.state);                }                if (!activity.mCalled) {                    throw new SuperNotCalledException(                        "Activity " + r.intent.getComponent().toShortString() +                        " did not call through to super.onCreate()");                }                r.activity = activity;                r.stopped = true;                if (!r.activity.mFinished) {                    activity.performStart();                    r.stopped = false;                }                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()) {                        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()");                    }                }            }            r.paused = true;            mActivities.put(r.token, r);        } catch (SuperNotCalledException e) {            throw e;        } catch (Exception e) {            if (!mInstrumentation.onException(activity, e)) {                throw new RuntimeException(                    "Unable to start activity " + component                    + ": " + e.toString(), e);            }        }        return activity;}
首先呢通过ActivityClientRecord参数获取到AcitivtyInfo和组件的包名+类名,然后获取了ClassLoader类加载器,接下来使用mInstrumentation.newActivity把类加载器,包名及Intent传递进去,通过反射来获取到编写的Activity类,这样就获取到了Activity.

接下来依序获取了Context,Title之类的配置通过activity调用attach方法设置了以后,获取了Theme设置给Activity通过mInstrumentation.callActivityOnCreate()间接调用了Activity的方法,然后下面又调用了onStart方法,那么这个方法结束以后出去下面又调用了onResume(),至此Activity处于Active(活动状态).

那么最后说一下Activity的启动流程.首先呢从Launch(手机桌面),它本身就是一个应用程序.

1.点击一个图标后他会通过AMS接口告诉AMS我要开启一个应用程序,

2.然后AMS就通过ApplicationThread告诉Launch进入Pause状态,

3.然后进入了pause后会告诉AMS我已经pause了,

4.接下来AMS去创建进程啊,什么Acitivity的任务栈啊供ActivityThread运行

5.,ActivityThread通过AMS的Binder接口传递给它ApplicationThread,

6.AMS一看,好没有问题,你该干啥干啥吧,有事喊我.

那么这就是一个Android应用的启动流程了,那么至于Activity的开启过程呢,就是少了创建进程和Activity任务栈之类的,其他都差不多,都是通过AMS来管理,那么这篇文章就结束,谢谢.










更多相关文章

  1. 浅谈Java中Collections.sort对List排序的两种方法
  2. Python list sort方法的具体使用
  3. python list.sort()根据多个关键字排序的方法实现
  4. 【阿里云镜像】切换阿里巴巴开源镜像站镜像——Debian镜像
  5. android app请求获取root权限
  6. Android开发设置Activity全屏与不全屏的方法
  7. APK 的自我保护
  8. Android(安卓)获取cpu序列号
  9. Android(安卓)相机拍照获取图片并保存到指定位置。

随机推荐

  1. Android控件之TextView全解析
  2. 从零开始--系统深入学习android(实践-让我
  3. Android内核详解之Low memory killer
  4. 在Ubuntu7.10上编译android
  5. android差分更新之服务端
  6. Ubuntu下 eclipse搭建android集成开发环
  7. Android开发人员终于在“app-构建控制台
  8. Android(安卓)EGL
  9. Android(安卓)Develop API 1
  10. Android(安卓)bitmap图片处理