Android Window、PhoneWindow、WindowManager、Activity学习心得

Android Window、PhoneWindow、WindowManager、Activity学习心得 第一弹

阅读本文,你首先需要理解

Context 上下文环境,Window 窗口的准确含义。

Android应用程序的Activity启动过程简要介绍和学习计划)。

我们需要知道Activity有显式启动和隐式启动两种,但是不管是什么启动方式。我们要知道借助于应用程序框架层的ActivityManagerService服务进程。

目录(源码目录/frameworks/base/services/java/com/android/server/am/ActivityManagerService.java)

以后我将用 Android = 源码目录 (默认为Android4.4)

在Android应用程序框架层中,ActivityManagerService是一个非常重要的接口,它不但负责启动Activity和Service,还负责管理Activity和Service。

Android应用程序框架层中的ActivityManagerService启动Activity的过程大致如下图所示:

具体启动过程不再做过多赘述,我们这里只需要知道通过ActivityManagerService把这个启动Activity的操作转发给ActivityThread,ActivityThread通过ClassLoader导入相应的Activity类,,然后把它启动起来。

目录(Android4.4/frameworks/base/core/java/android/app/ActivityThread.java)

那么,我们下一步进入到ActivityThread执行handleLaunchActivity

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent){………Activity a = performLaunchActivity(r, customIntent);if (a != null) {……handleResumeActivity(r.token, false, r.isForward,!r.activity.mFinished && !r.startsNotResumed);…….}…..}而在performLaunchActivity中public final class ActivityThread {……private final Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo = r.activityInfo;if (r.packageInfo == null) {r.packageInfo = getPackageInfo(aInfo.applicationInfo,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的Package 和 Component 信息Activity activity = null;try {java.lang.ClassLoader cl = r.packageInfo.getClassLoader();activity = mInstrumentation.newActivity(cl, component.getClassName(), r.intent);r.intent.setExtrasClassLoader(cl);if (r.state != null) {r.state.setClassLoader(cl);}} catch (Exception e) {……}//通过ClassLoade 根据收集的信息把你的Activity加载进来try {Application app = r.packageInfo.makeApplication(false, mInstrumentation);//根据AndroidManifest.xml配置文件中的Application标签的信息来创建……if (activity != null) {ContextImpl appContext = new ContextImpl();appContext.init(r.packageInfo, r.token, this);appContext.setOuterContext(activity);CharSequence title = r.activityInfo.loadLabel(appContext.getPackageManager());Configuration config = new Configuration(mConfiguration);……<span style="color:#ff6666;">activity.attach(appContext, this, getInstrumentation(), r.token,r.ident, app, r.intent, r.activityInfo, title, r.parent,r.embeddedID, r.lastNonConfigurationInstance,r.lastNonConfigurationChildInstances, config);</span>//这里正式开始我们的窗口创建if (customIntent != null) {activity.mIntent = customIntent;}r.lastNonConfigurationInstance = null;r.lastNonConfigurationChildInstances = null;activity.mStartedActivity = false;int theme = r.activityInfo.getThemeResource();if (theme != 0) {activity.setTheme(theme);}activity.mCalled = false;mInstrumentation.callActivityOnCreate(activity, r.state);……r.activity = activity;r.stopped = true;if (!r.activity.mFinished) {activity.performStart();r.stopped = false;}if (!r.activity.mFinished) {if (r.state != null) {mInstrumentation.callActivityOnRestoreInstanceState(activity, r.state);}}if (!r.activity.mFinished) {activity.mCalled = false;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) {……} catch (Exception e) {……}return activity;}……}</span>以上关于ActivityThread 启动Activity,如果还有什么不明白的请查看

@Android应用程序启动过程源代码分析

紧接着上一步,我们跟踪到Activity的attach

目录(Android 4.4 /frameworks/base/core/java/android/app/Activity.java)

待人对事不要太计较,如果太计较就会有悔恨!

Android Window、PhoneWindow、WindowManager、Activity学习心得

相关文章:

你感兴趣的文章:

标签云: