日期: 2021 年 8 月 12 日

WindowManager.LayoutParams全解

WindowManager.LayoutParams全解

public static class

WindowManager.LayoutParams

extends ViewGroup.LayoutParams
implements Parcelable

java.lang.Object
   ? android.view.ViewGroup.LayoutParams
   ? android.view.WindowManager.LayoutParams

WindowManager.LayoutParams 是 WindowManager 接口的嵌套类;它继承于 ViewGroup.LayoutParams; 它用于向WindowManager描述Window的管理策略。

主要成员常量
Window flag系列
该系列主要用于对Window的flag进行设置。设置Window的flag,可以直接对Window的getAttributes()得到其 WindowManager.LayoutParams对象,然后直接对它flag变量操作。也可以Window的addFlags(int flags)方法,setFlags(int flags, int mask)方法,clearFlags(int flags)方法进行操作。
比如设置全屏:
 Window window = getWindow();
 WindowManager.LayoutParams winParams = win.getAttributes();
 winParams.flags=winParams.flags|WindowManager.LayoutParams.FLAG_FULLSCREEN;
 或
 window.addFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
 或
 window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
 取消全屏
 Window window = getWindow();
 winParams.flags=winParams.flags&~WindowManager.LayoutParams.FLAG_FULLSCREEN;
 或
 window.clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
 或
window.setFlags(0, WindowManager.LayoutParams.FLAG_FULLSCREEN);
所有Window flag如下:
int FLAGS_CHANGED 用于表示flags发生了变化,关于此的详细内容请看后文。
int FLAG_ALLOW_LOCK_WHILE_SCREEN_ON Window flag: as long as this window is visible to the user, allow the lock screen to activate while the screen is on.
当该window对用户可见的时候,允许锁屏。
int FLAG_ALT_FOCUSABLE_IM Window flag: invert the state of FLAG_NOT_FOCUSABLE with respect to how this window interacts with the current method.
int FLAG_BLUR_BEHIND Window flag: blur everything behind this window.
让该window后所有东西都模糊(blur)
int FLAG_DIM_BEHIND Window flag: everything behind this window will be dimmed.
让该window后所有的东西都成暗淡(dim)
int FLAG_DISMISS_KEYGUARD Window flag: when set the window will cause the keyguard to be dismissed,
only if it is not a secure lock keyguard.
int FLAG_DITHER Window flag: turn on dithering when compositing this window to the screen.
开启抖动(dithering)
int FLAG_FORCE_NOT_FULLSCREEN Window flag: Override {@link #FLAG_FULLSCREEN and force the screen decorations (such as status bar) to be shown.
恢复window非全屏显示  (让背景不是暗淡的)
int FLAG_FULLSCREEN Window flag: Hide all screen decorations (e.g.
让window进行全屏显示
int FLAG_HARDWARE_ACCELERATED Indicates whether this window should be hardware accelerated.

对该window进行硬件加速.

该flag必须在设置你的Activity或Dialog的Content View之前进行设置,

而且如果你在mainfest文件中用android:hardwareAccelerated开启了该属性的话,那么你在程序中就不能再改变它。mainfest文件中android:hardwareAccelerated属性默认是开启的(“true”)。

int FLAG_IGNORE_CHEEK_PRESSES Window flag: intended for windows that will often be used when the user is holding the screen against their face, it will aggressively filter the event stream to prevent unintended presses in this situation that may not be desired for a particular window, when such an event stream is detected, the application will receive a CANCEL motion event to indicate this so applications can handle this accordingly by taking no action on the event until the finger is released.
int FLAG_KEEP_SCREEN_ON Window flag: as long as this window is visible to the user, keep the device’s screen turned on and bright.
当该window对用户可见时,让设备屏幕处于高亮(bright)状态。
int FLAG_LAYOUT_INSET_DECOR Window flag: a special option only for use in combination with FLAG_LAYOUT_IN_SCREEN.
int FLAG_LAYOUT_IN_SCREEN Window flag: place the window within the entire screen, ignoring decorations around the border (a.k.a.
让window占满整个手机屏幕,不留任何边界(border)
int FLAG_LAYOUT_NO_LIMITS Window flag: allow window to extend outside of the screen.
window大小不再不受手机屏幕大小限制,即window可能超出屏幕之外,这时部分内容在屏幕之外。
int FLAG_NOT_FOCUSABLE Window flag: this window won’t ever get key input focus, so the user can not send key or other button events to it.
让window不能获得焦点,这样用户快就不能向该window发送按键事件及按钮事件
int FLAG_NOT_TOUCHABLE Window flag: this window can never receive touch events.
让该window不接受触摸屏事件
int FLAG_NOT_TOUCH_MODAL Window flag: Even when this window is focusable (its {@link #FLAG_NOT_FOCUSABLE is not set),
allow any pointer events outside of the window to be sent to the windows behind it.
即使在该window在可获得焦点情况下,仍然把该window之外的任何event发送到该window之后的其他window.
int FLAG_SCALED Window flag: a special mode where the layout parameters are used to perform scaling of the surface when it is composited to the screen.
int FLAG_SECURE Window flag: don’t allow screen shots while this window is displayed.
当该window在进行显示的时候,不允许截屏。
int FLAG_SHOW_WALLPAPER Window flag: ask that the system wallpaper be shown behind your window.
在该window后显示系统的墙纸(wallpaper)
int FLAG_SHOW_WHEN_LOCKED Window flag: special flag to let windows be shown when the screen is locked.
当锁屏的时候,显示该window.
int FLAG_SPLIT_TOUCH Window flag: when set the window will accept for touch events outside of its bounds to be sent to other windows that also support split touch. When this flag is not set, the first pointer that goes down determines the window to which all subsequent touches go until all pointers go up. When this flag is set, each pointer (not necessarily the first) that goes down determines the window to which all subsequent touches of that pointer will go until that pointer goes up thereby enabling touches with multiple pointers to be split across multiple windows
当该window在可以接受触摸屏情况下,让因在该window之外,而发送到后面的window的触摸屏可以支持split touch.
int FLAG_TOUCHABLE_WHEN_WAKING Window flag: When set, if the device is asleep when the touch screen is pressed, you will receive this first touch event.
当手机处于睡眠状态时,如果屏幕被按下,那么该window将*个收到到事件
int FLAG_TURN_SCREEN_ON Window flag: when set as a window is being added or made visible, once the window has been shown then the system will poke the power manager’s user activity (as if the user had woken up the device) to turn the screen on.
当然window被显示的时候,系统将把它当做一个用户活动事件,以点亮手机屏幕。
int FLAG_WATCH_OUTSIDE_TOUCH Window flag: if you have set FLAG_NOT_TOUCH_MODAL, you can set this flag to receive a single special MotionEvent with the action MotionEvent.ACTION_OUTSIDE
for touches that occur outside of your window.
如果你设置了该flag,那么在你FLAG_NOT_TOUNCH_MODAL的情况下,即使触摸屏事件发送在该window之外,其事件被发送到了后面的window,那么该window仍然将以MotionEvent.ACTION_OUTSIDE形式收到该触摸屏事件
softInputMode系列
该系列主要用于表示softInputMode,我们可以通过WindowManager.LayoutParams的softInputMode变量直接进行设置。softInputMode只能是一个显示软键盘时的window调整方式bite与一个控制软键盘显示状态的bite的组合。
显示软键盘时的window调整方式可以是SOFT_INPUT_ADJUST_NOTHING,SOFT_INPUT_ADJUST_PAN,
SOFT_INPUT_ADJUST_RESIZE,SOFT_INPUT_ADJUST_UNSPECIFIED之一。
用于描述软键盘显示的规则可以是SOFT_INPUT_STATE_ALWAYS_HIDDEN,SOFT_INPUT_STATE_ALWAYS_VISIBLE,
SOFT_INPUT_STATE_HIDDEN,SOFT_INPUT_STATE_VISIBLE,SOFT_INPUT_STATE_UNSPECIFIED之一
关于softInputMode的更多知识请参考《软件盘的开关》
所有的softInputMode系列常量如下:
int SOFT_INPUT_ADJUST_NOTHING Adjustment option for softInputMode: set to have a window not adjust for a shown input method.
当显示软键盘时,不调整window的布局
int SOFT_INPUT_ADJUST_PAN Adjustment option for softInputMode: set to have a window pan when an input method is shown, so it doesn’t need to deal with resizing but just panned by the framework to ensure the current input focus is visible.
当显示软键盘时,调整window的空白区域来显示软键盘。即使调整空白区域,软键盘还是有可能遮挡一些有内容区域,这时用户就只有退出软键盘才能看到这些被遮挡区域并进行交互。
int SOFT_INPUT_ADJUST_RESIZE Adjustment option for softInputMode: set to allow the window to be resized when an input method is shown, so that its contents are not covered by the input method.
当显示软键盘时,调整window内的控件大小以便显示软键盘。这样的话控件可能会变形。
int SOFT_INPUT_ADJUST_UNSPECIFIED Adjustment option for softInputMode: nothing specified.
不指定显示软件盘时,window的调整方式。
int SOFT_INPUT_IS_FORWARD_NAVIGATION Bit for softInputMode: set when the user has navigated forward to the window.
表示用户导航(navigate)到了你的window
int SOFT_INPUT_MASK_ADJUST Mask for softInputMode of the bits that determine the way that the window should be adjusted to accommodate the soft input window.
显示软键盘时,用于表示window调整方式的bite的mask。
显示软键盘时的window调整方式可以是SOFT_INPUT_ADJUST_NOTHING,SOFT_INPUT_ADJUST_PAN,SOFT_INPUT_ADJUST_RESIZE,SOFT_INPUT_ADJUST_UNSPECIFIED。
用于描述软键盘显示的规则可以是SOFT_INPUT_STATE_ALWAYS_HIDDEN,SOFT_INPUT_STATE_ALWAYS_VISIBLE,
SOFT_INPUT_STATE_HIDDEN,SOFT_INPUT_STATE_VISIBLE,SOFT_INPUT_STATE_UNSPECIFIED之一
int SOFT_INPUT_MASK_STATE Mask for softInputMode of the bits that determine the desired visibility state of the soft input area for this window.
用于描述软键盘显示规则的bite的mask.
int SOFT_INPUT_MODE_CHANGED 用于表示softInputMode发生了变化。关于此的详细内容请看后文。
int SOFT_INPUT_STATE_ALWAYS_HIDDEN Visibility state for softInputMode:
please always hide any soft input area when this window receives focus.
总是隐藏软键盘。
int SOFT_INPUT_STATE_ALWAYS_VISIBLE Visibility state for softInputMode:
please always make the soft input area visible when this window receives input focus.
总是显示软键盘
int SOFT_INPUT_STATE_HIDDEN Visibility state for softInputMode:
please hide any soft input area when normally appropriate (when the user is navigating forward to your window).
用户导航(navigate)到你的窗口的时候,隐藏软键盘
int SOFT_INPUT_STATE_UNCHANGED Visibility state for softInputMode: please don’t change the state of the soft input area.
int SOFT_INPUT_STATE_UNSPECIFIED Visibility state for softInputMode: no state has been specified.
没有软键盘显示的约定规则
int SOFT_INPUT_STATE_VISIBLE Visibility state for softInputMode: please show the soft input area when normally appropriate
(when the user is navigating forward to your window).
用户导航(navigate)到你的窗口的时候,显示软键盘
Window type系列
该系列主要用于表示window的类型。我们可以通过WindowManager.LayoutParams的type变量直接进行设置.
int TYPE_APPLICATION Window type: a normal application window.
普通的应用程序window,token必须设置为Activity的token,以指出该窗口属谁
int TYPE_APPLICATION_ATTACHED_DIALOG Window type: like TYPE_APPLICATION_PANEL, but layout of the window happens as that of a top-level window, not as a child of its container.
对话框。类似于面板窗口,绘制类似于顶层窗口,而不是宿主的子窗口。
int TYPE_APPLICATION_MEDIA Window type: window for showing media (e.g.
媒体窗口,例如视频。显示于宿主窗口下层。
int TYPE_APPLICATION_PANEL Window type: a panel on top of an application window.
面板窗口,显示于宿主窗口上层
int TYPE_APPLICATION_STARTING Window type: special application window that is displayed while the application is starting.
用于应用程序启动时所显示的窗口。应用本身不要使用这种类型。它用于让系统显示些信息,直到应用程序可以开启自己的窗口
int TYPE_APPLICATION_SUB_PANEL Window type: a sub-panel on top of an application window.
应用程序窗口的子面板。显示于所有面板窗口的上层。(GUI的一般规律,越“子”越靠上)
int TYPE_BASE_APPLICATION Window type: an application window that serves as the “base” window of the overall application; all other application windows will appear on top of it.
所有程序窗口的“基地”窗口,其他应用程序窗口都显示在它上面。
int TYPE_CHANGED 表示window的类型发生了变化,关于此的详细内容请看后文。
int TYPE_INPUT_METHOD Window type: internal input methods windows, which appear above the normal UI.
内部输入法窗口,显示于普通UI之上。应用程序可重新布局以免被此窗口覆盖
int TYPE_INPUT_METHOD_DIALOG Window type: internal input methods dialog windows, which appear above the current input method window.
内部输入法对话框,显示于当前输入法窗口之上
int TYPE_KEYGUARD Window type: keyguard window.
锁屏窗口
int TYPE_KEYGUARD_DIALOG Window type: dialogs that the keyguard shows
锁屏时显示的对话框
int TYPE_PHONE Window type: phone.
电话窗口。它用于电话交互(特别是呼入)。它置于所有应用程序之上,状态栏之下。
int TYPE_PRIORITY_PHONE Window type: priority phone UI, which needs to be displayed even if the keyguard is active.
电话优先,当锁屏时显示。此窗口不能获得输入焦点,否则影响锁屏。
int TYPE_SEARCH_BAR Window type: the search bar.
搜索栏。只能有一个搜索栏;它位于屏幕上方。
int TYPE_STATUS_BAR Window type: the status bar.
状态栏类型的window。只能有一个状态栏window;它位于屏幕顶端,其他窗口都位于它下方。
int TYPE_STATUS_BAR_PANEL Window type: panel that slides out from over the status bar
状态栏的滑动面板
int TYPE_SYSTEM_ALERT Window type: system window, such as low power alert.
系统提示window,比如电池低的警告。它总是出现在应用程序窗口之上。
int TYPE_SYSTEM_DIALOG Window type: panel that slides out from the status bar
系统对话框。(例如音量调节框)
int TYPE_SYSTEM_ERROR Window type: internal system error windows, appear on top of everything they can.
系统内部错误提示,显示于所有内容之上
int TYPE_SYSTEM_OVERLAY Window type: system overlay windows, which need to be displayed on top of everything else.
系统顶层窗口。显示在其他一切内容之上。此窗口不能获得输入焦点,否则影响锁屏。
int TYPE_TOAST Window type: transient notifications.
toast类型的window
int TYPE_WALLPAPER Window type: wallpaper window,
placed behind any window that wants to sit on top of the wallpaper.
用于墙纸的window
window 的类型被分为了3大类:
Application windows (ranging from FIRST_APPLICATION_WINDOW to LAST_APPLICATION_WINDOW) are normal top-level application windows. For these types of windows, the token must be set to the token of the activity they are a part of (this will normally be done for you if token is null).
Sub-windows (ranging from FIRST_SUB_WINDOW to LAST_SUB_WINDOW) are associated with another top-level window. For these types of windows, the token must be the token of the window it is attached to.
System windows (ranging from FIRST_SYSTEM_WINDOW to LAST_SYSTEM_WINDOW) are special types of windows for use by the system for specific purposes. They should not normally be used by applications, and a special permission is required to use them.
系统专门定义了FIRST_APPLICATION_WINDOW , LAST_APPLICATION_WINDOW,FIRST_SUB_WINDOW, LAST_SUB_WINDOW,
FIRST_SYSTEM_WINDOW,LAST_SYSTEM_WINDOW 以表示window的3大类型的类型的取值的范围。
int FIRST_APPLICATION_WINDOW Start of window types that represent normal application windows.
Constant Value: 1 (0x00000001)
int FIRST_SUB_WINDOW Start of types of sub-windows.
Constant Value: 1000 (0x000003e8)
int FIRST_SYSTEM_WINDOW Start of system-specific window types.
Constant Value: 2000 (0x000007d0)
int LAST_APPLICATION_WINDOW End of types of application windows.
Constant Value: 99 (0x00000063)
int LAST_SUB_WINDOW End of types of sub-windows.
Constant Value: 1999 (0x000007cf)
int LAST_SYSTEM_WINDOW End of types of system windows.
Constant Value: 2999 (0x00000bb7)
关于更多请看下文《WindowManager.LayoutParams(下)》

WindowManager.LayoutParams(下)  

2011-08-07 08:08:54|  分类: Android基础 |  标签:windowmanager   |字号中小 订阅

本文参照自:http://developer.android.com/reference/android/view/WindowManager.LayoutParams.html

BRIGHTNESS系列
该系列主要用于设置window的brightness(screenBrightness/buttonBrightness)。我们可以通过WindowManager.LayoutParams的screenBrightness/buttonBrightness变量直接进行设置。
其中screenBrightness表示屏幕的brightness,而buttonBrightness表示一般按键和键盘按键的brightness
float BRIGHTNESS_OVERRIDE_FULL Value for screenBrightness and buttonBrightness
indicating that the screen or button backlight brightness should be set to the hightest value
when this window is in front.
把brightness(screenBrightness/buttonBrightness)设置到*高值。
float BRIGHTNESS_OVERRIDE_NONE Default value for screenBrightness and buttonBrightness indicating that the brightness value is not overridden for this window and normal brightness policy should be used.
不对brightness(screenBrightness/buttonBrightness)重新进行设置,采用默认的普通值。
float BRIGHTNESS_OVERRIDE_OFF Value for screenBrightness and buttonBrightness indicating that the screen or button backlight brightness should be set to the lowest value when this window is in front.
把brightness(screenBrightness/buttonBrightness)设置到*低值。
changed系列
该系列主要用于 int copyFrom (WindowManager.LayoutParams o)函数中。
在函数中,首先将用参数中传入的WindowManager.LayoutParams的信息复制到本WindowManager.LayoutParams中,然后返回一个整数,以bite形式表示调用该函数后WindowManager.LayoutParams的哪些信息发送了变化
int ALPHA_CHANGED 用于表示成员变量alpha是否被改变
int ANIMATION_CHANGED 用于表示成员变量windowAnimations是否被改变
int DIM_AMOUNT_CHANGED 用于表示成员变量dimAmount是否被改变
int FLAGS_CHANGED 用于表示成员变量flags是否被改变
int LAYOUT_CHANGED 用于表示layout是否被改变.这里的layout是指以下变量所包含的信息:
width,height,x,y, verticalMargin,verticalWeight,horizontalMargin,horizontalWeight
int SCREEN_BRIGHTNESS_CHANGED 用于表示brightness是否被改变.
这里的brightness是指以下变量对应的信息:screenBrightness,buttonBrightness
int SCREEN_ORIENTATION_CHANGED 用于表示成员变量screenOrientation是否被改变
int SOFT_INPUT_MODE_CHANGED 用于表示成员变量softInputMode是否被改变
int TITLE_CHANGED 用于表示成员变量title是否被改变
int TYPE_CHANGED 用于表示成员变量type是否被改变
int FORMAT_CHANGED Constant Value: 8 (0x00000008)
用于表示成员变量format是否被改变
成员变量
继承于ViewGroup.LayoutParams的成员变量
public int height Information about how tall the view wants to be.
public LayoutAnimationController.AnimationParameters layoutAnimationParameters Used to animate layouts.
public int width Information about how wide the view wants to be.
自身的成员变量
public static final Creator<WindowManager.LayoutParams> CREATOR
public float alpha An alpha value to apply to this entire window.
public float buttonBrightness This can be used to override the standard behavior of the button and keyboard backlights.
public float dimAmount When FLAG_DIM_BEHIND is set, this is the amount of dimming to apply.
public int flags Various behavioral options/flags.
public int format The desired bitmap format.
public int gravity Placement of window within the screen as per Gravity.
public float horizontalMargin The horizontal margin, as a percentage of the container’s width, between the container and the widget.
public float horizontalWeight Indicates how much of the extra space will be allocated horizontally to the view associated with these LayoutParams.
public int memoryType This field is deprecated. this is ignored
public String packageName Name of the package owning this window.
public float screenBrightness This can be used to override the user’s preferred brightness of the screen.
public int screenOrientation Specific orientation value for a window.
public int softInputMode Desired operating mode for any soft input area.
public int systemUiVisibility Control the visibility of the status bar.
public IBinder token Identifier for this window.
public int type The general type of window.
public float verticalMargin The vertical margin, as a percentage of the container’s height, between the container and the widget.
public float verticalWeight Indicates how much of the extra space will be allocated vertically to the view associated with these LayoutParams.
public int windowAnimations A style resource defining the animations to use for this window.
public int x X position for this window.
public int y Y position for this window.
成员函数
ublic Methods
final int copyFrom(WindowManager.LayoutParams o)
String debug(String output)

Returns a String representation of this set of layout parameters.
int describeContents()

Describe the kinds of special objects contained in this Parcelable’s marshalled representation.
final CharSequence getTitle()
static boolean mayUseInputMethod(int flags)

Given a particular set of window manager flags, determine whether such a window may be a target for an input method when it has focus.
final void setTitle(CharSequence title)
String toString()

Returns a string containing a concise, human-readable description of this object.
void writeToParcel(Parcel out, int parcelableFlags)

Flatten this object in to a Parcel.
window与软件盘交互设置WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL 同时不能设WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE

Android优化—UI检视利器:Hierarchy Viewer

在Android的SDK工具包中,有很多十分有用的工具,可以帮助程序员开发和测试Android应用程序,大大提高其工作效率。其中的一款叫 Hierachy Viewer的可视化调试工具,可以很方便地在开发者设计,调试和调整界面时,提高用户的开发效率。本文将以一个实际例子讲解如何使用该款工具运用在 Android的开发过程中。本文的读者对象为具备初步Android知识的用户。

步骤1 设计界面

在我们的这个例子中,有三个不同的界面,以方便我们演示使用Hierarchy Viewer。每一个界面都使用了LinearLayout和FrameLayout布局,以及文本框TextView及图片框ImageView控件。 如下图,三个界面中的图案分别用了一只小猫,一个鱼缸,一条金鱼,它们各自的位置布局见下图:

Android 实用工具Hierarchy Viewer实战

在上面的三个图中,*左面的一个图,使用了一个垂直布局的LinearLayout,并且划分为两行,*行是一个TextView文本框,里面的文字是“Safe”,第2行是一个FrameLayout帧布局,分别包含了一条鱼和一个鱼缸子。

中间的图中,使用了一个垂直布局的LinearLayout,并且划分为两行,*行是写有“Unsafe”文本的文本框,第二行也有一个LinearLayout的水平布局,分别又包含了两个ImageView控件:一个鱼缸及鱼,还有一只小猫。

*右边的图中,使用了一个垂直布局的LinearLayout,并且划分为两行,*行是写有“Yum” 文本的文本框,第2行是一个FrameLayout帧布局,分别包含了一条小猫和一条鱼。跟*张图有点相象。

步骤2 启动应用程序

在设计界面后,我们直接用模拟器启动我们的应用程序,要注意的是,在debug状态下,是不能启动Hierachy Viewer的。

       hierarchyviewer.bat是sdk自带的工具,在tools文件夹下。双击即可打开

1)连接设备真机或者模拟器(真机可能无法连接,我用的2.3,连接上了,没读到内容);

2)启动你要观察的应用。

3)打开Hierarchyviewer,点击hierarchyviewer文件即可

介绍android 布局查看利器hierarchyviewer.bat

步骤3 启动Hierachy Viewer

 

目前,在eclipse的ADT Android插件中,还不能启动Hierachy Viewer,但可以从Android SDK工具包中,通过命令行的方式可以启动,具体方法为,到Android SDK下的tools目录下,在命令行方式下运行hierachyviewer即可。

在启动后,可以看到如下的界面,会显示当前正在运行中的模拟器的信息,这里我们可以鼠标点击我们已经启动了的Activity:

Android 实用工具Hierarchy Viewer实战

同时可以看到,有两个按钮,分别代表两个功能:

1)Load View Hierarchy (可以查看界面的控件层次)

2)Inspect Screenshot (进入界面精确查看模式)

下面分别介绍两者的功能。

步骤4 Inspecting Screenshots(界面精确查看模式)

先点Inspecting Screenshots按钮,进入界面精确查看模式。在这个模式

下,开发者可以随意点界面的任意一部分,进行放大或缩小观察以查看界面中各控件的具体位置和情况,如下图所示:

Android 实用工具Hierarchy Viewer实战

同时,还可以将截取的界面另外保存为PNG格式的图片文件。

步骤5 Load View Hierarchy 查看界面的控件层次

接下来,我们重点学习如何在Load View Hierachy中查看界面中各个控件的层次结构关系。首先当点Load View Hierarchy按钮后,会进入如下图所示界面:

Android 实用工具Hierarchy Viewer实战

要注意的是,在屏幕的左下方,有三个按钮,当点*左边的按钮时,返回的是模拟器的列表界面(也就是刚进入Hierarchy Viwer的界面),中间按钮则是Load View Hierachy的主界面,用户可以在这两种状态中来回切换。

接下来,我们看上图,Load View Hierachy界面被划分为四个部分,分别是*左边(面积*大一块),该部分显示界面控件的层次结构,我们称之为主窗口,而右上方的一个部分,是以缩略 图的方式显示整个应用中的各控件的层次关系,当如果一个界面中的控件比较多的时候,可以通过鼠标在这个显示区域进行移动,则左边的主窗口中会具体显示相关 的控件信息。右边区域的中间部分,显示的每个控件的具体属性,是控件的属性面版。而右下角部分的区域,则是当用户点界面中的某个控件时,会在该部分显示区 域,显示出用户所点的控件,在界面中的具体位置,会用红色部分标出,方便用户辨识。

步骤6 理解Hierachy Viewer的主窗口

*左部分的主窗口,将一个Activity中的所有控件的层次结构从左到右显示了出来,其中*右部分是*低一层的控件。用我们的例子来说,如果 选择了*个界面(即上文提到的三张图界面的*左边的一张),在主窗口的*右边,从右往左看,可以看到*右边的是两个ImageView控件:鱼缸的图片 和小鱼的图片。

再往左看,会看到这两个控件实际上是被包裹在FrameLayout布局中,这里可以清楚看到指出了这个布局的id为 @id/frameLayoutFishbowl。再往左边看,可以看到再上一层的控件:LinearLayout布局控件以及它包含的一个 TextView控件(显示“Safe”字样)以及@id/frameLayoutFishbowl的frameLayout布局控件。

读者可以尝试,在Hierachy viewer中,查看另外两个activity界面中的控件,熟悉其中的用法。

步骤7 查看每个具体控件的情况

当在主窗口中,点击每一个控件时,将会可以看到很多关于这个控件的详细信息,会在该控件的上方弹出一个窗口,其中会显示该控件的实际的效果图 外,通过view的数目显示了该控件及其子控件的数目,该控件的该节点的测量(measure)、布局(layout)以及画视图(draw)的时间,如 下图:

Android 实用工具Hierarchy Viewer实战

如上图,这里1 view表明这个文本控件没再包含其他子控件了,只有1个就是它本身。而下方的带颜色的三个圆圈指示灯,分别说明了在测量(measure)、布局 (layout)以及画视图(draw)三个阶段,这个控件所占用的时间百分比,如果是绿色的,表示该控件在该阶段比起其他的50%的控件的速度要快,为 黄色的表示比起其他的50%的控件的速度要慢,为红色的则表示该控件在该阶段的处理速度是*慢的,如下图:

Android 实用工具Hierarchy Viewer实战

当我们按“display View”按钮后,在当我们点某个控件时,在稍等1-2秒后,会另外单独打开一个小窗口,显示该空间的单独效果图。

我们再来看下右上角的缩略显示窗口。当界面里的控件太多时,可以在这个窗口中,点选某一部分,随即会在主窗口中显示该区域控件的情况,而在右方 中部的属性列表中,会显示所点击的控件的详细属性情况。右下角则显示所点击的控件在整个界面中的实际位置,如果勾选了show extra views,则还会在这个区域中,将控件的实际图片也显示出来,十分清晰。下图是我们点金鱼这个图片时,实际显示的效果:

Android 实用工具Hierarchy Viewer实战

步骤8 刷新显示

要注意的是,在Hierarchy Viewer中,当修改了界面后,需要手工点Refresh按钮,才能同步在Hierarchy Viewer中显示更新过后的界面情况。下图是分别对应用中的第2,第3个界面进行操作的示意图,可以看到,这两个界面的布局比*个界面稍微复杂了。

Android 实用工具Hierarchy Viewer实战

Android 实用工具Hierarchy Viewer实战

对于Android的UI来说,invalidate和requestLayout是*重要的过程,Hierarchyviewer提供了帮助我们 Debug特定的UI执行invalidate和requestLayout过程的途径,方法很简单,只要选择希望执行这两种操作的View点击按钮就可 以。当然,我们需要在例如onMeasure()这样的方法中打上断点。这个功能对于UI组件是自定义的非常有用,可以帮助单独观察相关界面显示逻辑是否 正确。

小结

在本文中,通过简单的例子,讲解了在Android中一款不错的工具Hierarchy viewer的使用,使用这个工具,用户可以很方便地查看和调试应用中的UI界面,分析其性能,建议用户在开发阶段多使用这款工具对UI进行开发设计。

Android优化—内存分析工具 MAT 的使用

1 内存泄漏的排查方法

Dalvik Debug Monitor Server (DDMS) 是 ADT插件的一部分,其中有两项功能可用于内存检查 :

·    heap 查看堆的分配情况

·    allocation tracker跟踪内存分配情况

DDMS 这两项功能有助于找到内存泄漏的操作行为。

Eclipse Memory Analysis Tools (MAT) 是一个分析 Java堆数据的专业工具,用它可以定位内存泄漏的原因。

工具地址 : https://www.eclipse.org/mat/

1.1 观察 Heap

·        运行程序,然后进入 DDMS管理界面,如下:

%title插图%num

PS : 点击工具栏上的  %title插图%num来更新统计信息

点击右侧的 Cause GC 按钮或工具栏上的  %title插图%num即可查看当前的堆情况,如下:

%title插图%num

主要关注两项数据:

o    Heap Size 堆的大小,当资源增加,当前堆的空余空间不够时,系统会增加堆的大小,若超过上限 (例如64M,视平台和具体机型而定)则会被杀掉

o    Allocated 堆中已分配的大小,这是应用程序实际占用的内存大小,资源回收后,此项数据会变小

·        查看操作前后的堆数据,看是否有内存泄漏
对单一操作(比如添加页,删除页)进行反复操作,如果堆的大小一直增加,则有内存泄漏的隐患。

 

获取 hprof文件
点击工具栏上的  %title插图%num按钮,将内存信息保存成文件。 如果是用 MAT Eclipse 插件获取的 Dump文件,则不需要经过转换,Adt会自动进行转换然后打开。 

·        转换 hprof文件
DDMS Dump 出的文件要经过转换才能被 MAT识别,Android SDK提供了这个工具 hprof-conv (位于sdk/tools下)

·    ./hprof-conv xxx-a.hprof xxx-b.hprof

·        用 MAT打开转换后的 hprof文件

%title插图%num

 

1.3  Histogram 查询

用的*多的功能是 Histogram,点击 Actions下的 Histogram项将得到 Histogram结果:

%title插图%num

它按类名将所有的实例对象列出来,可以点击表头进行排序,在表的*行可以输入正则表达式来匹配结果 :

%title插图%num

在某一项上右键打开菜单选择 list objects ->with incoming refs 将列出该类的实例:

%title插图%num

它展示了对象间的引用关系,比如展开后的*个子项表示这个 HomePage(0x420ca5b0)被HomePageContainer(0x420c9e40)中的 mHomePage属性所引用.

快速找出某个实例没被释放的原因,可以右健 Path to GC Roots–>exclue all phantom/weak/soft etc. reference :

%title插图%num

得到的结果是:

%title插图%num

从表中可以看出 PreferenceManager -> … ->HomePage这条线路就引用着这个 HomePage实例。用这个方法可以快速找到某个对象的 GC Root,一个存在 GC Root的对象是不会被 GC回收掉的.

 

1.4  Histogram 对比

为查找内存泄漏,通常需要两个 Dump结果作对比,打开 Navigator History面板,将两个表的 Histogram结果都添加到 Compare Basket中去 :

%title插图%num

添加好后,打开 Compare Basket面板,得到结果:

%title插图%num

点击右上角的 ! 按钮,将得到比对结果:

%title插图%num

注意,上面这个对比结果不利于查找差异,可以调整对比选项:

%title插图%num

再把对比的结果排序,就可得到直观的对比结果:

%title插图%num

也可以对比两个对象集合,方法与此类似,都是将两个 Dump结果中的对象集合添加到Compare Basket中去对比。找出差异后用 Histogram查询的方法找出 GC Root,定位到具体的某个对象上。

 

1.5  例子

举例一个典型的分析内存泄漏的过程:

1.  使用 Heap查看当前堆大小为 23.00M

2.  添加一个页后堆大小变为 23.40M

3.  将添加的一个页删除,堆大小为 23.40M

4.  多次操作,结果仍相似,说明添加/删除页存在内存泄漏 (也应注意排除其它因素的影响)

5.  Dump 出操作前后的 hprof 文件 (1.hprof,2.hprof),用 mat打开,并得到 histgram结果

6.  使用 HomePage字段过滤 histgram结果,并列出该类的对象实例列表,看到两个表中的对象集合大小不同,操作后比操作前多出一个 HomePage,说明确实存在泄漏

7.  将两个列表进行对比,找出多出的一个对象,用查找 GC Root的方法找出是谁串起了这条引用线路,定位结束

PS :

·        很多时候堆增大是 Bitmap引起的,Bitmap在 Histogram中的类型是 byte [],对比两个 Histogram中的byte[] 对象就可以找出哪些 Bitmap有差异

·        多使用排序功能,对找出差异很有用

 

存在无效的引用!
良好的模块设计以及合理使用设计模式有助于解决此问题。 

 

使用 android:largeHeap=”true”标记 (API Level >= 11)
在 AndroidManifest.xml中的 Application节点中声明即可分配到更大的堆内存, android:largeHeap标记在Android系统应用中也有广泛的应用 ,比如 Launcher, Browser这些内存大户上均有使用. 

mysql的服务器是啥意思_请问“接口服务器”、“应用服务器” 、“数据库服务器”分别是指什么意思?

展开全部

数据库:存e5a48de588b662616964757a686964616f31333433626563储数据的应用软件。

服务器:公共的服务库。

应用服务器是应用的服务器,提供应用服务,也可以是自己的网络应用服务器,接口服务器是提供给第三方调用的服务,主要是为了自己的应用的安全性,所以只把能供给第三方调用的东西封装在应用服务器服务器。
%title插图%num

根据应用环境的不同,需要的数据库服务器也不同,一般来说,如果数据库服务器需要连接的客户端多、并且是不同权限组的客户端的话需要网络接口比较多的,除此之外,数据库服务器的处理器性能要求比较高,因为其要进行频繁的操作,内存要求大,加快数据存取速度。

应用服务器相对而言要求低一些,如果是FTP服务器的话网卡的速率要求要高,起码是千兆的,网页服务器对于网卡的速率也同样有较高的要求,但对于处理器性能要求就不那么高了。

应用程序服务器是为应用程序提供业务逻辑的。它是基于组件的,位于以服务器为中心的架构的中间件。

这个架构通常是一个主要的基于Web的界面。中间件是业务逻辑所在的应用服务器。而第三层,后端是负责数据库的服务器。应用程序服务器充当用户和数据库之间的交互。
%title插图%num

应用服务器通过各种协议向客户端应用程序打开业务逻辑。它还可以包括计算机,web服务器或其他应用服务器上的图形用户界面。业务逻辑通过组件API。它还管理自己的资源以及执行安全性,事务处理,资源和连接池以及消息传递。

对于高端要求,应用服务器往往具有高可用性监控,集群,负载平衡,集成冗余和高性能分布式应用服务,并支持复杂的数据库访问。

当需要与现有数据库和服务器(如Web服务器)集成时,应使用应用程序服务器,可以通过启用集中式方法来提供应用程序更新和升级来提供数据和代码的完整性。

可伸缩性是使用应用服务器的另一个原因和好处。应用程序服务器可以与数据库连接。这意味着企业可以扩展Web服务器群,而不需要增加数据库连接的数量。

从网页到数据库的直接链接如果暴露,可导致SQL注入攻击基础架构。

通过单独的数据访问层执行数据验证和/或显示业务逻辑,可以确保以Web表单输入的文本不被用作SQL调用。通过集中身份验证过程以及数据访问管理,还可以提高安全性。

应用程序服务器与Web服务器不同,因为前者通过多种协议处理向应用程序提供业务逻辑,而Web服务器响应并处理HTTP请求;托管一个网站并存储静态内容,如图像,CSS,JavaScript和HTML页面。

%title插图%num

虽然Web服务器可能不支持事务或数据库连接,但可能具有容错和可扩展性功能,如负载平衡,缓存和集群。

与数据库服务器不同,因为该服务器执行诸如数据分析,存储,数据处理,归档以及其他数据管理相关任务之类的任务。

数据库服务器使用诸如ODBC,JDBC等协议。他们还将托管数据库,如Oracle,SQLServer,MySQL等。

扩展资料:

服务器是计算机局域网的核心部件。网络操作系统是在网络服务器上运行的,网络服务器的效率直接影响整个网络的效率。

因此,一般要用高档计算机或专用服务器计算机作为网络服务器。网络服务器主要有以下4个作用:

运行网络操作系统,控制和协调网络中各计算机之间的工作,*大限度地满足用户的要求,并做出响应和处理。

存储和管理网络中的共享资源,如数据库、文件、应用程序、磁盘空间、打印机、绘图仪等。

·为各工作站的应用程序服务,如采用客户/服务器(Client/Server)结构使网络服务器不仅担当网络服务器,而且还担当应用程序服务器。

 

如何选择数据库服务器

如何选择数据库服务器

数据库服务器主要用于存储、查询、检索企业内部的信息,因此需要搭配专用的数据库系统,对服务器的兼容性、可靠性和稳定性等方面都有很高的要求。

大型企业需要的数据库服务器性能和扩展能力等方面要求更高,它们在组建数据库系统时,不仅仅是使用多台数据库服务器,还需要存储系统等。而中小企业则有些不同,它们需要的数据库服务器性能不需要像大型企业数据库服务器那么强,数量要求也没那么多,因此在选择服务器时更轻松一些。

为了使消费者能够根据实际情况配置性价比*高的服务器,我们首先探讨一下DBMS和服务器之间的关系,然后根据市场行情向大家推荐适合不同规模企业应用的数据库服务器。

就国内的实际应用情况来看,各企业单位使用*广泛的无疑还是这两种DBMS:Oracle,MS SQL Server,首先我们分析一下这两种DBMS对于服务器的要求。

Oracle:内存系统是关键

ORACLE是目前业内公认*牛的DBMS,广泛用于大中型企业、高等院校和科学研究领域,也是目前*流行的客户/服务器 (CLIENT/SERVER)体系结构的DBMS之一。ORACLE 数据库提供了新的分布式数据库能力,可通过网络较方便地读写远端数据库里的数据,并有对称复制的技术。

根据实际使用测试的经验,ORACLE 数据库在运行时效率是非常高的,它非常巧妙而合理的使用了系统内存。当然,它同时也是大量的使用了系统内存,ORACLE 数据库要有足够容量的系统内存进行支持才能较好的发挥其性能优势,尤其是那些数据库写入工作(例如 UPDATE、INSERT/ADDNEW等动作)比较频繁的应用,使用大容量内存非常有必要。

因此,如果您是使用ORACLE 数据库,可以在系统内存容量方面进行提升;另外,数据库对内存系统要求高并不是说一味提升内存容量就OK了,整体性能的提高无论任何时候都是真理,对于一些中高端的应用,我们推荐大家使用8路或更8路以上的服务器。

MS SQL Server:青睐CPU和磁盘

这是微软的商业DBMS,有多个版本,需要在Windows 2000 Advanced Server或Windows 2003 Server Enterprise Edition上面才能安装,目前常用的版本还是MS SQL Server 2000,尽管新版本已经问世。该DBMS在国内应用也非常普及,各种中小型企业和院校应用都看得到它的身影,大部分以IIS+ASP/.NET模式运行的中等以上规模WEB站点都是使用这套DBMS。

MS SQL Server对服务器设备的要求并不像ORACLE那么高,但是根据大多数程序员使用的感受,要提高MS SQL Server的性能在处理器和磁盘系统上做文章效果比较明显。SQL Server等数据库对二级缓存的要求比较高,多处理器下可以提升二级缓存,鉴于MS SQL Server的主流应用环境一般都是高频的双路XEON,另外,Opteron表现确实非常优秀,也可以适当考虑;磁盘系统采用RAID 0或者RAID 1用户可以自己决定,如果有配阵列卡,组个RAID 5也可以;特别说明一下,Windows 2003 Server Enterprise Edition执行效率确实比Windows 2000 Advanced Server高,对于使用MS SQL Server的用户来说可以考虑使用2003作为操作系统。

当然,DBMS除了ORACLE,SQL Server外,还有My SQL和Access等等。数据库服务器是一种整体性能要求都很高的服务器,如果单纯说它在某个方面有更多的要求,显然不太合理。通常,数据库服务器应达到以下配置:

——采用双路或者更多的处理器,以提高服务器的处理能力以及对数据库的并行操作,达到增加吞吐量的目的。

——对内存要求非常大,大容量的内存可以节省处理器访问硬盘的时间,提高数据库服务器的性能。

——需要大容量的存储空间,所以数据库服务器一般都采用SCSI硬盘作为存储介质,在数据存储方面通常都要实现RAID,这样不但能提升数据存储安全,还能提升整体性能。当然,一些大中型企业还会建立存储系统来满足需求.

文件服务器和数据库服务器的区别

文件服务器于客户/服务器数据库之间有一个重要差别.从根本上说,这两个术语指数据处理的两种不同方式.

在文件服务器数据库中,数据存放在文件之中,数据的各个用户直接从文件中取得他们所需的东西.当有修改发生时,应用程序打开文件并写入新数据.当需要显示现有数据时,应用程序打开文件并读取数据.如果一个数据库有20个不同的用户,那么所有20个用户均读取和写入这个相同的文件.

同文件服务器数据库的情形相反,在客户/服务器数据库中,虽然数据仍然存放在文件中,但文件访问由一个统一的主程序控制.当一个应用程序需要利用现有数据时,这个应用程序向服务器发送一个请求.服务器查找相应的数据,并将这个数据发回到应用程序.当一个应用程序需要向数据库中写入新数据时,它将该数据发送到服务器,然后由服务器执行实际的写入操作.只有一个统一的程序对数据文件执行读取和写入操作.

一般说来,面向单用户桌面的数据库(比如Acess\Foxpro)都是文件服务器数据库,而面向部门、公司或企业用户的数据库(Oracle\sybase\sql)都是客户/服务器数据库。客户/服务器数据库在大型环境中有几个重要优势,其中包括:

1、由于只有一个统一的程序读取和写入数据,所以破坏关键数据的意外修改或瘫痪的可能性更小。

2、这个统一的服务器程序可以充当一个监视所有客户的看门人,从而使安全政策的建立和执行变得更容易。

3、由于线路上只有请求流和结果流,所以客户/服务器数据库会比文件服务器数据库更有效的利用网络带宽。

4、由于只有所有的读取和写入都由一台统一的计算机来完成,所以升级这台计算机来提高数据库性能变得更容易。

5、客户/服务器数据库往往提供保护数据的特性,比如日志事务和磁盘或网络错误的恢复。严格地说,文件服务器数据库也会提供这些特性

数据库和服务器的关系

服务器就像筷子 ,数据库就像是一盘菜 程序就像人,人们用筷子夹盘子里的菜来吃。
一般来说图片保存在服务器上 确切说应该是保存在服务器主机上,服务器可以保存东西 那要数据库来做什么?数据库是用来保存数据让我们来直接调用的
就算是图片保存在服务器上也会把他的地址保存到数据库里 再通过地址来调用

应用连不上mysql_应用服务器连接不上数据库服务器问题解决

错误现象:

在浏览器中,登录管理后台,出现如下错误:

A network-related or instance-specific

error occurred while establishing a connection to SQL Server. The

server was not found or was not accessible. Verify that the

instance name is correct and that SQL Server is configured to allow

remote connections. (provider: TCP Provider, error: 0 –

由于系统缓冲区空间不足或队列已满,不能执行套接字上的操作。)

该web服务*近运行都很正常,没有修改过任何代码和配置,应该不会是代码打开数据库后没有关闭连接,造成连接池满的问题,更多的问题服务器访问上。

解决步骤:

1,在自己的PC上,可以连接数据库服务器。并且telnet数据库端口,也是通的。

2,查看数据库sysprocesses表,连接数据很少,排除连接池满的问题。

3,打开数据库事件探查器,发现执行速度非常快。

4,重启IIS,问题依旧。

5,重启数据库服务器,问题依旧。

6,在应用服务器上,不能连接数据库服务器。telnet数据库服务器数据库端口,无法连接。ping

数据库服务器,是通的。其他机器可以访问数据库,而应用服务器不能访问,确定问题出在应用服务器,同时确定故障应该在防火墙配置上。

7,关闭瑞星防火墙,退出360安全卫士,问题依旧。

8,卸载瑞星防火墙,重启应用服务器,问题解决。

至此,*大可能是应用服务器的瑞星防火墙今天凌晨进行了自动升级,造成了访问数据库的故障。以后出现过瑞星防火墙升级后,出现一些问题,大多是不能被其他机器访问,现在访问其他服务器也不行。

对瑞星防火墙,彻底失望,以后都不会再用了!

数字组合

数字组合
题目 有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?
程序分析 遍历全部可能,把有重复的剃掉。
1
total=0
for i in range(1,5):
    for j in range(1,5):
        for k in range(1,5):
            if ((i!=j)and(j!=k)and(k!=i)):
                print(i,j,k)
                total+=1
print(total)

个税计算

个税计算
题目 企业发放的*金根据利润提成。利润(I)低于或等于10万元时,*金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放*金总数?
程序分析 分区间计算即可。
1
profit=int(input(‘Show me the money: ‘))
bonus=0
thresholds=[100000,100000,200000,200000,400000]
rates=[0.1,0.075,0.05,0.03,0.015,0.01]
for i in range(len(thresholds)):
    if profit<=thresholds[i]:
        bonus+=profit*rates[i]
        profit=0
        break
    else:
        bonus+=thresholds[i]*rates[i]
        profit-=thresholds[i]
bonus+=profit*rates[-1]
print(bonus)
友情链接: SITEMAP | 旋风加速器官网 | 旋风软件中心 | textarea | 黑洞加速器 | jiaohess | 老王加速器 | 烧饼哥加速器 | 小蓝鸟 | tiktok加速器 | 旋风加速度器 | 旋风加速 | quickq加速器 | 飞驰加速器 | 飞鸟加速器 | 狗急加速器 | hammer加速器 | trafficace | 原子加速器 | 葫芦加速器 | 麦旋风 | 油管加速器 | anycastly | INS加速器 | INS加速器免费版 | 免费vqn加速外网 | 旋风加速器 | 快橙加速器 | 啊哈加速器 | 迷雾通 | 优途加速器 | 海外播 | 坚果加速器 | 海外vqn加速 | 蘑菇加速器 | 毛豆加速器 | 接码平台 | 接码S | 西柚加速器 | 快柠檬加速器 | 黑洞加速 | falemon | 快橙加速器 | anycast加速器 | ibaidu | moneytreeblog | 坚果加速器 | 派币加速器 | 飞鸟加速器 | 毛豆APP | PIKPAK | 安卓vqn免费 | 一元机场加速器 | 一元机场 | 老王加速器 | 黑洞加速器 | 白石山 | 小牛加速器 | 黑洞加速 | 迷雾通官网 | 迷雾通 | 迷雾通加速器 | 十大免费加速神器 | 猎豹加速器 | 蚂蚁加速器 | 坚果加速器 | 黑洞加速 | 银河加速器 | 猎豹加速器 | 海鸥加速器 | 芒果加速器 | 小牛加速器 | 极光加速器 | 黑洞加速 | movabletype中文网 | 猎豹加速器官网 | 烧饼哥加速器官网 | 旋风加速器度器 | 哔咔漫画 | PicACG | 雷霆加速