android如何获取分屏区域的宽高,Android N获取屏幕高度的问题
获取屏幕高度的代码
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获取屏幕高度的问题相关推荐
- JavaScript获取浏览器可视区域的宽高
JavaScript获取浏览器可视区域的宽高 在做项目的时候,我们常常需要对项目做一些优化,来提升页面响应的速度,比如进入可视区域后再发送请求获取数据或者是填充模板,这个时候就需要能够获取到浏览器的可 ...
- js兼容性——获取当前浏览器窗口的宽高
通过onresize事件 1 window.onresize = function () { 2 document.title = client().width + " "+ cl ...
- Android N App分屏模式完全解析
Android N App分屏模式完全解析(上) 发表于 2016-03-12 | 分类于 技术 | 上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Andro ...
- Android N App分屏模式完全解析(上)
上手了Android N Preview,第一个不能错过的新特性就是App分屏的支持.Android7.0原生系统就可以支持两个App横屏并排或者竖屏上下摆放了.第二个新特性就是在Android TV ...
- 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 ...
- android适配华为分屏怎样打开,Android的分屏模式开发注意事项
android7.0 的API开始有了分屏功能,在测试时注意到主页面在分屏模式下,页面所占比例在增大或者减小的时候都会调用oncreat方法,所以查资料总结一下分屏对页面的生命周期的影响以及开发时的注 ...
- android n进入分屏代码分析_不只是分屏多任务,Android N 的这些特性也与你有关...
本文来自 TECH2IPO / 创见,作者@DavidZh 2016 年 Google I/O 大会开放注册之后,Google 出人意料地放出了下一代移动操作系统 Android N 的开发者版本. ...
- js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法)
js进阶 11-6 jquery如何获取和设置元素的宽高(jquery多方法) 一.总结 一句话总结:jquery里面多是方法啊,比如jquery对象的宽高.所以取值是方法,赋值就是方法里面带参数. ...
- javascript 快速获取图片实际大小的宽高
javascript 快速获取图片实际大小的宽高 简陋的获取图片实际宽高的方式 // 图片地址 var img_url = '13643608813441.jpg'// 创建对象 var img = ...
最新文章
- JS实例学习笔记——w3cschool+菜鸟教程
- 微信公众号开发 常用脚本累计
- 工业大数据的真正意义和价值
- 天合公司 TRW Inc.
- GitHub基本使用
- 产生数(floyd+高精度计算)
- vscode运行python文件_vscode怎么运行python文件
- 131_Power Query之获取钉钉日志自动刷新Power BI报告
- redis主从配置转
- 【虚拟化实战】存储设计之二LUN Sizing
- 基于tornado的爬虫并发问题
- 【渝粤教育】电大中专跨境电子商务理论与实务 (25)作业 题库
- SLAM中的边缘化舒尔补
- 小梅哥Xilinx FPGA学习笔记10——串口通信发送
- 2018/8/16第二周
- python股票接口_股市python接口
- nginx配置深析1
- 新手必看!EEGLAB工具包下载、安装及数据导入教程
- Java 随机数生成器 Random SecureRandom 原理分析
- 在电脑测试c语言编程,C语言电脑编程兴趣班测试题目