Android Display Graphics #从Activity看surface的创建(1)

Android智能座舱系列

系列文章请扫关注公众号!

创建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的创建

。。。。。。

详细系列文章详情,请关注公众号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值