获取屏幕高度的代码

int getScreenHeight(Activity context) {

WindowManager wm = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);

DisplayMetrics metrics = new DisplayMetrics();

wm.getDefaultDisplay().getMetrics(metrics);

return metrics.heightPixels;

}

问题现象

在Android N 7.0(SDK 24)上当,Activity进入过分屏模式再退出后,使用上面的代码去获取屏幕高度,得到的值是真正的屏幕高度减去状态栏的高度。然而在Android 7.1(SDK 25) 上,确没有这个问题,猜测是谷歌的BUG,在7.1上已经得到了修正。同时出问题的时候,传入的context是Activity,但是当我传入的是ApplicationContext时,返回的屏幕高度又是正确的,这就无语了。

问题原因

通过调试Android SDK 24和25的框架代码,发现出现问题的原因是,SDK 24的ActivityThread的performConfigurationChanged方法configuration没有正确地更新,但是SDK25做了修正。下面直接给出导致这个问题的框架代码:

Android 7.0

public final class ActivityThread {

...

private void performConfigurationChanged(...) {

...

boolean shouldChangeConfig = false;

if ((activity == null) || (activity.mCurrentConfig == null)) {

shouldChangeConfig = true;

} else {

// If the new config is the same as the config this Activity

// is already running with then don't bother calling

// onConfigurationChanged

int diff = activity.mCurrentConfig.diff(newConfig);

if (diff != 0) {

shouldChangeConfig = true;

}

}

...

}

Android 7.1

public final class ActivityThread {

...

private void performConfigurationChanged(...) {

...

boolean shouldChangeConfig = false;

if ((activity == null) || (activity.mCurrentConfig == null)) {

shouldChangeConfig = true;

} else {

// If the new config is the same as the config this Activity is already

// running with and the override config also didn't change, then don't

// bother calling onConfigurationChanged.

int diff = activity.mCurrentConfig.diff(newConfig);

if (diff != 0 || !mResourcesManager.isSameResourcesOverrideConfig(activityToken, amOverrideConfig)) {

// Always send the task-level config changes. For system-level configuration, if

// this activity doesn't handle any of the config changes, then don't bother

// calling onConfigurationChanged as we're going to destroy it.

if (!mUpdatingSystemConfig

|| (~activity.mActivityInfo.getRealConfigChanged() & diff) == 0

|| !reportToActivity) {

shouldChangeConfig = true;

}

}

}

...

}

比较这两块代码,可以发现 SDK25增加了!mResourcesManager.isSameResourcesOverrideConfig(activityToken, amOverrideConfig)这个条件来设置shouldChangeConfig的值。如果shouldChangeConfig那么Activity的configuration在退出分屏后会更新为未分屏之前的值。

解决方案

为了解决这个问题,只需要将context更换为ApplicationContext即可。

android如何获取分屏区域的宽高,Android N获取屏幕高度的问题相关推荐

  1. JavaScript获取浏览器可视区域的宽高

    JavaScript获取浏览器可视区域的宽高 在做项目的时候,我们常常需要对项目做一些优化,来提升页面响应的速度,比如进入可视区域后再发送请求获取数据或者是填充模板,这个时候就需要能够获取到浏览器的可 ...

  2. js兼容性——获取当前浏览器窗口的宽高

    通过onresize事件 1 window.onresize = function () { 2 document.title = client().width + " "+ cl ...

  3. Android N App分屏模式完全解析

    Android N App分屏模式完全解析(上) 发表于 2016-03-12 |  分类于 技术 | 上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Andro ...

  4. Android N App分屏模式完全解析(上)

    上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Android7.0原生系统就可以支持两个App横屏并排或者竖屏上下摆放了.第二个新特性就是在Android TV ...

  5. Android N App分屏模式完全解析(下)

    转载地址:http://unclechen.github.io/2016/03/12/Android-N-App%E5%88%86%E5%B1%8F%E6%A8%A1%E5%BC%8F%E5%AE%8 ...

  6. android适配华为分屏怎样打开,Android的分屏模式开发注意事项

    android7.0 的API开始有了分屏功能,在测试时注意到主页面在分屏模式下,页面所占比例在增大或者减小的时候都会调用oncreat方法,所以查资料总结一下分屏对页面的生命周期的影响以及开发时的注 ...

  7. android n进入分屏代码分析_不只是分屏多任务,Android N 的这些特性也与你有关...

    本文来自 TECH2IPO / 创见,作者@DavidZh 2016 年 Google I/O 大会开放注册之后,Google 出人意料地放出了下一代移动操作系统 Android N 的开发者版本. ...

  8. js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)

    js进阶 11-6  jquery如何获取和设置元素的宽高(jquery多方法) 一.总结 一句话总结:jquery里面多是方法啊,比如jquery对象的宽高.所以取值是方法,赋值就是方法里面带参数. ...

  9. javascript 快速获取图片实际大小的宽高

    javascript 快速获取图片实际大小的宽高 简陋的获取图片实际宽高的方式 // 图片地址 var img_url = '13643608813441.jpg'// 创建对象 var img = ...

最新文章

  1. JS实例学习笔记——w3cschool+菜鸟教程
  2. 微信公众号开发 常用脚本累计
  3. 工业大数据的真正意义和价值
  4. 天合公司 TRW Inc.
  5. GitHub基本使用
  6. 产生数(floyd+高精度计算)
  7. vscode运行python文件_vscode怎么运行python文件
  8. 131_Power Query之获取钉钉日志自动刷新Power BI报告
  9. redis主从配置转
  10. 【虚拟化实战】存储设计之二LUN Sizing
  11. 基于tornado的爬虫并发问题
  12. 【渝粤教育】电大中专跨境电子商务理论与实务 (25)作业 题库
  13. SLAM中的边缘化舒尔补
  14. 小梅哥Xilinx FPGA学习笔记10——串口通信发送
  15. 2018/8/16第二周
  16. python股票接口_股市python接口
  17. nginx配置深析1
  18. 新手必看!EEGLAB工具包下载、安装及数据导入教程
  19. Java 随机数生成器 Random SecureRandom 原理分析
  20. 在电脑测试c语言编程,C语言电脑编程兴趣班测试题目

热门文章

  1. ResNet、残差结构、迁移学习
  2. 【Shake_It_Off】mmd动作+镜头下载
  3. 3 机器学习入门——决策树之天气预报、鸢尾花
  4. 总线(三)CAN 协议及标准规格
  5. 干货解析 | 如何通过用户的行为序列来提升欺诈风险识别
  6. 软件测试工程师面试题答案分类详解-一家老牌培训机构内部绝密文件!
  7. 关于重装WIN10后有NVIDIA驱动但没有控制面板的可能的解决办法
  8. 基于物体路标的仿人机器人实时里程计
  9. NLP点滴——文本相似度
  10. 微波射频学习笔记13-------π型衰减和T型衰减