Android Window、PhoneWindow、Activity学习心得第二弹

Android Window、PhoneWindow、Activity学习心得第二弹 Window 分析

这里先给出部分源码

目录(Android 4.4/frameworks/base/core/java/android/view/Window.java)

public abstract class Window {public static final int FEATURE_OPTIONS_PANEL = 0;public static final int FEATURE_NO_TITLE = 1;…….public static final int FEATURE_CONTEXT_MENU = 6;public static final int FEATURE_CUSTOM_TITLE = 7;public static final int FEATURE_ACTION_BAR = 8;public static final int FEATURE_ACTION_BAR_OVERLAY = 9;…….public interface Callback {…..public boolean dispatchKeyEvent(KeyEvent event);……public boolean dispatchTouchEvent(MotionEvent event);…..public boolean dispatchGenericMotionEvent(MotionEvent event);….public View onCreatePanelView(int featureId);….public boolean onMenuItemSelected(int featureId, MenuItem item);…..public void onWindowAttributesChanged(WindowManager.LayoutParams attrs);public void onContentChanged();public void onWindowFocusChanged(boolean hasFocus);public void onAttachedToWindow();public void onDetachedFromWindow();public void onPanelClosed(int featureId, Menu menu);public boolean onSearchRequested();public ActionMode onWindowStartingActionMode(ActionMode.Callback callback);public void onActionModeStarted(ActionMode mode);public void onActionModeFinished(ActionMode mode);}public void setCallback(Callback callback) {mCallback = callback;}public void setFlags(int flags, int mask) {final WindowManager.LayoutParams attrs = getAttributes();attrs.flags = (attrs.flags&~mask) | (flags&mask);if ((mask&WindowManager.LayoutParams.FLAG_NEEDS_MENU_KEY) != 0) {attrs.privateFlags |= WindowManager.LayoutParams.PRIVATE_FLAG_SET_NEEDS_MENU_KEY;}mForcedWindowFlags |= mask;if (mCallback != null) {mCallback.onWindowAttributesChanged(attrs);}}public boolean requestFeature(int featureId) {final int flag = 1<<featureId;mFeatures |= flag;mLocalFeatures |= mContainer != null ? (flag&~mContainer.mFeatures) : flag;return (mFeatures&flag) != 0;}public View findViewById(int id) {return getDecorView().findViewById(id);}public abstract void setContentView(int layoutResID);public abstract void setTitle(CharSequence title);public abstract LayoutInflater getLayoutInflater();}首先,正如我们所知道的通过回调的方式Activity implements Window.Callback

而Callback主要用来处理

按键事件(dispatchKeyEvent)

触摸事件 (dispatchTouchEvent) 滑动事件(dispatchTrackballEvent)等等一系列事件

设置菜单、ActionMOde、监控内容等一系列动作

正是因为

mWindow = PolicyManager.makeNewWindow(this);mWindow.setCallback(this);监听回调,所以一系列最终的处理交给了Activity

当然,这里对于处理不做具体分析

接下来,我们看看

Window属性 FEATURE_OPTIONS_PANEL = 0; 功能不明,参见后面的说明(默认使能)  FEATURE_NO_TITLE = 1; 无标题栏  FEATURE_PROGRESS = 2; 在标题栏上显示加载进度,例如webview加载网页时(条状进度条)  FEATURE_LEFT_ICON = 3; 在标题栏左侧显示一个图标  FEATURE_RIGHT_ICON = 4; 在标题栏右侧显示一个图标  FEATURE_INDETERMINATE_PROGRESS = 5; 不确定的进度(圆圈状等待图标)  FEATURE_CONTEXT_MENU = 6; 上下文菜单,相当于PC上的右键菜单(默认使能)  FEATURE_CUSTOM_TITLE = 7; 自定义标题栏,该属性不能与其他标题栏属性合用  FEATURE_OPENGL = 8; 如果开启OpenGL,那么2D将由OpenGL处理(OpenGL中2D是3D的子集)  PROGRESS_VISIBILITY_ON = -1; 进度条可见  PROGRESS_VISIBILITY_OFF = -2; 进度条不可见  PROGRESS_INDETERMINATE_ON = -3; 开启不确定模式  PROGRESS_INDETERMINATE_OFF = -4; 关闭不确定模式  PROGRESS_START = 0; 第一进度条的最小值  PROGRESS_END = 10000; 第一进度条的最大值  PROGRESS_SECONDARY_START = 20000; 第二进度条的最小值  PROGRESS_SECONDARY_END = 30000; 第二进度条的最大值

这些 Feature 和 Flag 有什么用呢,其实很明显他们决定了我们Activity外貌(风格和样式)

那么,接下来我们就来看看Window的具体实现类PhoneWindow

目录(Android 4.4/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindow.java)

成功是奋斗的结果,而奋斗是成功的必经之路。

Android Window、PhoneWindow、Activity学习心得第二弹

相关文章:

你感兴趣的文章:

标签云: