android launcher开发(9)Launcher的窗口周期

来源:互联网 发布:一元夺宝源码系统 编辑:程序博客网 时间:2024/04/29 05:19

应用程序activity的创建

Launcher作为一个activity,如果要界面的显示,必须依附在窗口之上,也就是说,在anctivity创建之前,窗口必须进行创建。
当启动一个activiy的时候,activity管理服务通过activity线程类的perfromLaunchActivity方法创建应用程序运行的必要条件,例如上下文,窗口

应用程序窗口的创建

 final void attach(Context context, ActivityThread aThread,                      Instrumentation instr, IBinder token, int ident,                      Application application, Intent intent, ActivityInfo info,                      CharSequence title, Activity parent, String id,                      NonConfigurationInstances lastNonConfigurationInstances,                      Configuration config, String referrer, IVoiceInteractor voiceInteractor) {//     建立activity的上下文        attachBaseContext(context);//处理frgment        mFragments.attachHost(null /*parent*/);//     创建一个窗口实例         mWindow = new PhoneWindow(this);//        设置回掉接口,当窗口发生状态变换,则会提示activity        mWindow.setCallback(this);        mWindow.setOnWindowDismissedCallback(this);        mWindow.getLayoutInflater().setPrivateFactory(this);        if (info.softInputMode != WindowManager.LayoutParams.SOFT_INPUT_STATE_UNSPECIFIED) {            mWindow.setSoftInputMode(info.softInputMode);        }        if (info.uiOptions != 0) {            mWindow.setUiOptions(info.uiOptions);        }        mUiThread = Thread.currentThread();        mMainThread = aThread;        mInstrumentation = instr;        mToken = token;        mIdent = ident;        mApplication = application;        mIntent = intent;        mReferrer = referrer;        mComponent = intent.getComponent();        mActivityInfo = info;        mTitle = title;        mParent = parent;        mEmbeddedID = id;        mLastNonConfigurationInstances = lastNonConfigurationInstances;        if (voiceInteractor != null) {            if (lastNonConfigurationInstances != null) {                mVoiceInteractor = lastNonConfigurationInstances.voiceInteractor;            } else {                mVoiceInteractor = new VoiceInteractor(voiceInteractor, this, this,                        Looper.myLooper());            }        }//   创建一个窗口管理器        mWindow.setWindowManager(                (WindowManager)context.getSystemService(Context.WINDOW_SERVICE),                mToken, mComponent.flattenToString(),                (info.flags & ActivityInfo.FLAG_HARDWARE_ACCELERATED) != 0);        if (mParent != null) {            mWindow.setContainer(mParent.getWindow());        }        mWindowManager = mWindow.getWindowManager();        mCurrentConfig = config;    }

窗口中设置ui

在完成窗口创建以及activity的初始化之后,下一步进行的是往窗口中填充ui布局。
在activity中,我们采用setcontentView的方法进行设置。
在调用之前,我们需要判断窗口的根视图是否存在,如果不存在,则调用installAecor方法。
该方法进行应用程序窗口最初形态的设置。

0 0
原创粉丝点击