系列文章请扫关注公众号!
创建Activity
Activity是Android系统的应用组件,一般情况下,开发者显示的内容是通过Activity展示的。比如 使用Android studio创建一个空activity的demo,示例代码如下
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
这里的onCreate就调用到了Activity的onCreate,创建一个出来。
setContentView()用来绑定视图,将xml或java代码中的设置视图绑定到Activity上来。
Activity的创建呢,可以理解为3给个对象的创建:Window、DecorView、ViewRootImpl。
Window的创建
当用户从launcher界面点击一个应用时,Zygote收到相应请求后fork出一个子进程,这个子进程就是APP对应的进程。这个APP的入口函数就是ActivityThread的main函数:
Code Para#1 from Android 13
/frameworks/base/core/java/android/app/ActivityThread.java
L1: public final class ActivityThread extends ClientTransactionHandler
L2: implements ActivityThreadInternal {
L3: public static void main(String[] args) {
// 开始跟踪 "ActivityThreadMain" 事件
L4: Trace.traceBegin(Trace.TRACE_TAG_ACTIVITY_MANAGER, "ActivityThreadMain");
......
// 调用每个进程的主模块初始化
L5: initializeMainlineModules();
// 设置进程名称
L6: Process.setArgV0("<pre-initialized>");
// 为主线程准备消息循环
L7: Looper.prepareMainLooper();
......
// 创建并初始化 ActivityThread 对象,建立和ams的连接
L8: ActivityThread thread = new ActivityThread();
L9: thread.attach(false, startSeq);
// 结束 "ActivityThreadMain" 事件的跟踪
l10: Trace.traceEnd(Trace.TRACE_TAG_ACTIVITY_MANAGER);
// 启动消息循环
L11: Looper.loop();
// 如果主线程的消息循环意外退出,则抛出异常
L12: throw new RuntimeException("Main thread loop unexpectedly exited");
}
/** Core implementation of activity launch. */
L13: private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {
L14: ContextImpl appContext = createBaseContextForActivity(r);
L15: Activity activity = null;
L16: try {
L17: java.lang.ClassLoader cl = appContext.getClassLoader();
L18: activity = mInstrumentation.newActivity(
L19: cl, component.getClassName(), r.intent);
L20: activity.attach();
创建Activity对象,并调用attach()函数......
L21: mInstrumentation.callActivityOnCreate(activity, r.state);
L22: } catch (Exception e) {}
L23: return activity;
L24: }
Code para#2 from Android 13
/frameworks/base/core/java/android/app/Activity.java
@UiContext
L1:public class Activity extends ... {
L2: private static final String TAG = "Activity";
L3: private static final boolean DEBUG_LIFECYCLE = false;
@UnsupportedAppUsage
L4: private Window mWindow; //Activity首次被创建调用attach()方法时初始化的,创建在上面红色字体标注的attach
@UnsupportedAppUsage
L5: private WindowManager mWindowManager; //在attach方法中被创建,同mWindow对象
Activity的attach函数
L6: final void attach(Context context,... Window window...){
//创建PhoneWindow保存到变量mWindow,此时的Window还没有View视图
L7: mWindow = new PhoneWindow(this, window, activityConfigCallback);
L8: mWindow.setWindowManager(
L9: (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),
L10: mToken, mComponent.flattenToString(),
L11: (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);
}
//获取wms proxy对象,放到刚创建的window对象中,并保存到mWindowManager变量
L12: mWindowManager = mWindow.getWindowManager();
}
一系列的调用流程是:
ActivityThread#main()初始化调用attach()
-->attach() 创建ApplicationThread,并跨进程传递给AMS管理
-->AMS通过ApplicationThread通知ActivityThread创建Activity
-->performLaunchActivity() new Activity && run attach()
-->Activity#attach() create Window对象
DecorView的创建
在Code para#1段 L18-L21行的代码调用了Activity的attach()和onCreate();
Activity activity = new Activity();
-->activity.attach();//回调attach
-->activity.onCreate();//回调Activity
开发者通常会在onCreate()方法中调用setContentView()设置视图文件。
流程如下:
。。。。。
ViewRootImpl的创建
。。。。。。
详细系列文章详情,请关注公众号