【移动应用开发技术】Activity怎么显示界面_第1页
【移动应用开发技术】Activity怎么显示界面_第2页
【移动应用开发技术】Activity怎么显示界面_第3页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】Activity怎么显示界面

动画展示/upload/information/20210522/379/525107.png源码解析从小爱诞生说起//ActivityThread.java

private

Activity

performLaunchActivity(ActivityClientRecord

r,

Intent

customIntent)

{

//创建ContextImpl

ContextImpl

appContext

=

createBaseContextForActivity(r);

Activity

activity

=

null;

try

{

java.lang.ClassLoader

cl

=

appContext.getClassLoader();

//创建Activity

activity

=

mInstrumentation.newActivity(

cl,

component.getClassName(),

ent);

}

try

{

if

(activity

!=

null)

{

//完成activity的一些重要数据的初始化

activity.attach(appContext,

this,

getInstrumentation(),

r.token,

r.ident,

app,

ent,

r.activityInfo,

title,

r.parent,

r.embeddedID,

r.lastNonConfigurationInstances,

config,

r.referrer,

r.voiceInteractor,

window,

r.configCallback,

r.assistToken);

//调用activity的onCreate方法

if

(r.isPersistable())

{

mInstrumentation.callActivityOnCreate(activity,

r.state,

r.persistentState);

}

else

{

mInstrumentation.callActivityOnCreate(activity,

r.state);

}

}

}

return

activity;

}给小爱找个和View交互的帮手(PhoneWindow)//Activity.java

final

void

attach()

{

//创建PhoneWindow

mWindow

=

new

PhoneWindow(this,

window,

activityConfigCallback);

mWindow.setCallback(this);

mWindow.setWindowManager(

(WindowManager)context.getSystemService(Context.WINDOW_SERVICE),

mToken,

mComponent.flattenToString(),

(info.flags

&

ActivityInfo.FLAG_HARDWARE_ACCELERATED)

!=

0);

}加载布局文件(DecorView)//Activity.java

public

void

setContentView(@LayoutRes

int

layoutResID)

{

getWindow().setContentView(layoutResID);

initWindowDecorActionBar();

}//PhoneWindow.java

@Override

public

void

setContentView(int

layoutResID)

{

if

(mContentParent

==

null)

{

installDecor();

}

if

(!hasFeature(FEATURE_CONTENT_TRANSITIONS))

{

mLayoutInflater.inflate(layoutResID,

mContentParent);

}

}

private

void

installDecor()

{

if

(mDecor

==

null)

{

mDecor

=

generateDecor(-1);

}

else

{

mDecor.setWindow(this);

}

if

(mContentParent

==

null)

{

mContentParent

=

generateLayout(mDecor);

}

}

protected

DecorView

generateDecor(int

featureId)

{

return

new

DecorView(context,

featureId,

this,

getAttributes());

}//加载xml布局文件

mLayoutInflater.inflate(layoutResID,

mContentParent);

public

View

inflate(@LayoutRes

int

resource,

@Nullable

ViewGroup

root,

boolean

attachToRoot)

{

final

Resources

res

=

getContext().getResources();

final

XmlResourceParser

parser

=

res.getLayout(resource);

try

{

return

inflate(parser,

root,

attachToRoot);

}

finally

{

parser.close();

}

}显示出这个View(ViewRootImpl)@Override

public

void

handleResumeActivity()

{

//onResume

final

ActivityClientRecord

r

=

performResumeActivity(token,

finalStateRequest,

reason);

//addView

if

(r.window

==

null

&&

!a.mFinished

&&

willBeVisible)

{

r.window

=

r.activity.getWindow();

View

decor

=

r.window.getDecorView();

ViewManager

wm

=

a.getWindowManager();

WindowManager.LayoutParams

l

=

r.window.getAttributes()

wm.addView(decor,

l);

}//WindowManagerGlobal.java

public

void

addView()

{

synchronized

(mLock)

{

root

=

new

ViewRootImpl(view.getContext(),

display);

view.setLayoutParams(wparams);

mViews.add(view);

mRoots.add(root);

mParams.add(wparams);

try

{

root.setView(view,

wparams,

panelParentView);

}

}

}

public

ViewRootImpl(Context

context,

Display

display)

{

mContext

=

context;

mWindowSession

=

WindowManagerGlobal.getWindowSession();

mThread

=

Thread.currentThread();

}//ViewRootImpl.java

public

void

setView()

{

synchronized

(this)

{

//绘制

requestLayout();

//调用WMS的addWindow方法

res

=

mWindowSession.addToDisplay(mWindow,

mSeq,

mWindowAttributes,

getHostVisibility(),

mDisplay.getDisplayId(),

mWinFrame,

mAttachInfo.mContentInsets,

mAttachInfo.mStableInsets,

mAttachInfo.mOutsets,

mAttachInfo.mDisplayCutout,

mInputChannel);

//设置this(ViewRootImpl)为view(decorView)的parent

view.assignParent(this);

}

}//ViewRootImpl.java

@Override

public

void

requestLayout()

{

if

(!mHandlingLayoutInLayoutRequest)

{

checkThread();

mLayoutRequested

=

true;

scheduleTraversals();

}

}

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论