Android Activity window(7.1)解析(一)
来源:互联网 发布:linux shell % 编辑:程序博客网 时间:2024/06/16 20:13
本章介绍 activity window的组成
1、 Activity内部使用phoneWIndow来管理UI,PhoneWindow保持DecorView对象,来管理actionbar和 mian content
2、 PhoneWindow继承Window,用于管理窗口的UI display、事件分发等
3、content部分是activity的main view,当activity中调用setContentView方法时,此时是将View添加到content container部分
Activity被创建后,首先会调用Activity.attach方法,这里将创建PhoneWindow
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, Window window) { attachBaseContext(context); mFragments.attachHost(null /*parent*/); mWindow = new PhoneWindow(this, window); mWindow.setWindowControllerCallback(this); 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); } ....................... }
这里创建PhoneWindow对象mWindow,然后设置一些回调函数,我们知道,对UI的操作都是由PhoneWindow来管理的
下面我们看一下当activity调用setContentView方法里,PhoneWindow做了哪些操作:
PhoneWindow.java public void setContentView(View view, ViewGroup.LayoutParams params) { if (mContentParent == null) { installDecor(); } else if (!hasFeature(FEATURE_CONTENT_TRANSITIONS)) { mContentParent.removeAllViews(); } if (hasFeature(FEATURE_CONTENT_TRANSITIONS)) { view.setLayoutParams(params); final Scene newScene = new Scene(mContentParent, view); transitionTo(newScene); } else { mContentParent.addView(view, params); } mContentParent.requestApplyInsets(); final Callback cb = getCallback(); if (cb != null && !isDestroyed()) { cb.onContentChanged(); } mContentParentExplicitlySet = true; }
这里,我们把重点放在installDecor方法上
private void installDecor() { mForceDecorInstall = false; if (mDecor == null) { mDecor = generateDecor(-1); mDecor.setDescendantFocusability(ViewGroup.FOCUS_AFTER_DESCENDANTS); mDecor.setIsRootNamespace(true); if (!mInvalidatePanelMenuPosted && mInvalidatePanelMenuFeatures != 0) { mDecor.postOnAnimation(mInvalidatePanelMenuRunnable); } } else { mDecor.setWindow(this); } if (mContentParent == null) { mContentParent = generateLayout(mDecor); ................ }
通过generateDecor()方法生成DecorView对象mDecor,generateLayout方法找到content container
protected ViewGroup generateLayout(DecorView decor) { .................... //step1 int layoutResource; int features = getLocalFeatures(); // System.out.println("Features: 0x" + Integer.toHexString(features)); if ((features & (1 << FEATURE_SWIPE_TO_DISMISS)) != 0) { layoutResource = R.layout.screen_swipe_dismiss; } else if ((features & ((1 << FEATURE_LEFT_ICON) | (1 << FEATURE_RIGHT_ICON))) != 0) { if (mIsFloating) { TypedValue res = new TypedValue(); getContext().getTheme().resolveAttribute( R.attr.dialogTitleIconsDecorLayout, res, true); layoutResource = res.resourceId; } else { layoutResource = R.layout.screen_title_icons; } // XXX Remove this once action bar supports these features. removeFeature(FEATURE_ACTION_BAR); // System.out.println("Title Icons!"); } else if ((features & ((1 << FEATURE_PROGRESS) | (1 << FEATURE_INDETERMINATE_PROGRESS))) != 0 && (features & (1 << FEATURE_ACTION_BAR)) == 0) { // Special case for a window with only a progress bar (and title). // XXX Need to have a no-title version of embedded windows. layoutResource = R.layout.screen_progress; // System.out.println("Progress!"); } else if ((features & (1 << FEATURE_CUSTOM_TITLE)) != 0) { // Special case for a window with a custom title. // If the window is floating, we need a dialog layout if (mIsFloating) { TypedValue res = new TypedValue(); getContext().getTheme().resolveAttribute( R.attr.dialogCustomTitleDecorLayout, res, true); layoutResource = res.resourceId; } else { layoutResource = R.layout.screen_custom_title; } // XXX Remove this once action bar supports these features. removeFeature(FEATURE_ACTION_BAR); } else if ((features & (1 << FEATURE_NO_TITLE)) == 0) { // If no other features and not embedded, only need a title. // If the window is floating, we need a dialog layout if (mIsFloating) { TypedValue res = new TypedValue(); getContext().getTheme().resolveAttribute( R.attr.dialogTitleDecorLayout, res, true); layoutResource = res.resourceId; } else if ((features & (1 << FEATURE_ACTION_BAR)) != 0) { layoutResource = a.getResourceId( R.styleable.Window_windowActionBarFullscreenDecorLayout, R.layout.screen_action_bar); } else { layoutResource = R.layout.screen_title; } // System.out.println("Title!"); } else if ((features & (1 << FEATURE_ACTION_MODE_OVERLAY)) != 0) { layoutResource = R.layout.screen_simple_overlay_action_mode; } else { // Embedded, so no decoration is needed. layoutResource = R.layout.screen_simple; // System.out.println("Simple!"); }//step2 mDecor.startChanging(); mDecor.onResourcesLoaded(mLayoutInflater, layoutResource); //step3 ViewGroup contentParent = (ViewGroup)findViewById(ID_ANDROID_CONTENT); .................. mDecor.finishChanging(); return contentParent; }
1、这里在step1~step2之间的code是根据当前设置的feature来获取要加载的xml的layoutId,默认情况下加载的是R.layout.screen_simple
2、step3获取content container
到这里,activity window的大致组成讲解完毕
0 0
- Android Activity window(7.1)解析(一)
- Android源码解析Window系列第(一)篇---Window的基本认识和Activity的Window创建过程
- android:Activity、View和Window的关系(一)
- Android Activity (一)
- Android Activity(一)
- Android Activity 初识(一)
- Android Activity(一)初识
- Android activity 生命周期(一)
- Android之Activity(一)
- Android面试(一)Activity
- android UI结构 (1)Activity 与 Window
- android UI结构 (1)Activity 与 Window
- android UI结构 (1)Activity 与 Window
- android:Activity、View和Window的关系(二)
- Android Activity 完全解析(中)
- Android Activity 完全解析(下)
- 解析最简单的DirectX程序“Blank Window”(一)
- android-Activity-Window-View
- JSON基础知识总结
- Jquery中的验证jquery.validate.js
- 【centos7】安装redis
- ios之transform
- java中读取文件总结
- Android Activity window(7.1)解析(一)
- 使用PropertyPlaceholderConfigurer类读取外部属性文件内容到XML
- 设计模式-观察者模式
- JdbcTemplate/ SimpleJdbcTemplate
- 读取一个SQL文件 + 批量执行batchUpdate(String[ ])
- Oracle自动性能统计
- 数据库学习
- android自定义控件画布canvas背景色失效变黑色
- 表中父子关系