Android Framework学习笔记(十一)WindowManager体系,kotlininline函数

本文详细探讨了Android中WindowManager的使用,包括如何设置全屏模式,以及处理软键盘显示模式。讲解了WindowManager.LayoutParams中的SoftInputMode,并指出它们与AndroidManifest中Activity的windowSoftInputMode属性的对应关系。此外,文章还揭示了Activity启动过程中Window的添加流程,涉及到的关键类如ActivityThread、Window、PhoneWindow和WindowManagerGlobal。
摘要由CSDN通过智能技术生成

Window mWindow =getWindow();

mWindow.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

第三种则是给LayoutParams设置Flag,并通过WindowManager的addView方法进行添加:

WindowManager.LayoutParams mWindowLayoutParams = new WindowManager.LayoutParams();

mWindowLayoutParams.flags = WindowManager.LayoutParams.FLAG_FULLSCREEN;

WindowManager mWindowManager =(WindowManager)getSystemService(Context.WINDOW_SERVICE);

TextView mTextView=new TextView(this);

mWindowManager.addView(mTextView, mWindowLayoutParams);

软键盘相关模式


窗口和窗口的叠加是非常常见的场景,但如果其中的窗口是软键盘窗口,可能就会出现一些问题,比如典型的用户登录界面,默认的情况弹出的软键盘窗口可能会盖住输入框,这样用户体验会非常糟糕。

为了使得软键盘窗口能够按照期望来显示,WindowManager的静态内部类LayoutParams中还定义了软键盘相关模式,这里给出常用的几个:

//没有指定状态,系统会选择一个合适的状态或依赖于主题的设置

public static final int SOFT_INPUT_STATE_UNSPECIFIED = 0;

//不会改变软键盘状态

public static final int SOFT_INPUT_STATE_UNCHANGED = 1;

//当用户进入该窗口时,软键盘默认隐藏

public static final int SOFT_INPUT_STATE_HIDDEN = 2;

//当窗口获取焦点时,软键盘总是被隐藏

public static final int SOFT_INPUT_STATE_ALWAYS_HIDDEN = 3;

//当软键盘弹出时,窗口会调整大小

public static final int SOFT_INPUT_ADJUST_RESIZE = 0x10;

//当软键盘弹出时,窗口不需要调整大小,要确保输入焦点是可见的

public static final int SOFT_INPUT_ADJUST_PAN = 0x20;

从上面给出的SoftInputMode ,可以发现,它们与AndroidManifest中Activity的属性android:windowSoftInputMode是对应的。因此,除了在AndroidMainfest中为Activity设置android:windowSoftInputMode以外还可以在Java代码中为Window设置SoftInputMode:

getWindow().setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_ADJUST_RESIZE);

Window的添加过程


WindowManager对Window的操作最终都是交由WMS来进行处理。窗口的操作分为两大部分,一部分是WindowManager处理部分,另一部分是WMS处理部分。我们知道Window分为三大类,分别是:Application Window(应用程序窗口)、Sub Windwow(子窗口)和System Window(系统窗口),对于不同类型的窗口添加过程会有所不同,但是对于WMS处理部分,添加的过程基本上是一样的。

无论是哪种窗口,它的添加过程在WMS处理部分中基本是类似的,只不过会在权限和窗口显示次序等方面会有些不同。但是在WindowManager处理部分会有所不同,这里以最典型的应用程序窗口Activity为例。

Activity在启动过程中,会调用ActivityThread的handleLaunchActivity()方法,具体可以参考Framework学习(五)应用程序启动过程这篇文章。

frameworks/base/core/java/android/app/ActivityThread.java

ActivityThread#handleLaunchActivity()

private void handleLaunchActivity(ActivityClientRecord r, Intent customIntent, String reason) {

Activity a = performLaunchActivity(r, customIntent); //1

if (a != null) {

r.createdConfig = new Configuration(mConfiguration);

reportSizeConfigurations®;

Bundle oldState = r.state;

//2

handleResumeActivity(r.token, false, r.isForward, !r.activity.mFinished && !r.startsNotResumed, r.lastProcessedSeq, reason);

if (!r.activity.mFinished && r.startsNotResumed) {

performPauseActivityIfNeeded(r, reason);

if (r.i

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值