赞
踩
大家初学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("<pre-initialized>");
-
- 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下面又执行了一句代码把刚才创建的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("<pre-initialized>",
- 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<IBinder, ActivityOptions> pair = (Pair<IBinder, ActivityOptions>) 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<ResultInfo> 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<ResultInfo> pendingResults, List<ReferrerIntent> 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<ResultInfo> pendingResults, List<ReferrerIntent> pendingNewIntents,
- int configChanges, boolean notResumed, Configuration config,
- Configuration overrideConfig) {
- requestRelaunchActivity(token, pendingResults, pendingNewIntents,
- configChanges, notResumed, config, overrideConfig, true);
- }
-
- public final void scheduleNewIntent(List<ReferrerIntent> 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来管理,那么这篇文章就结束,谢谢.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。