Android 7.0需要注意的一些坑
来源:互联网 发布:部落冲突猪升级数据 编辑:程序博客网 时间:2024/06/06 06:51
弱弱的问一句,今天是情人节吗
1.安装时解析错误
我们的App通常会有检查更新的功能。用户在收到提示更新并且下载完后,会自动打开安装页面让用户来去安装。这时就会出现安装错误的问题,这类的问题的可能性比较多。比如较低版本的App想要覆盖已有的较高版本App会提示安装未完成,或是签名不一致导致的。不过7.0上常见的有以下两种情况。
1.应用间共享文件
在targetSdkVersion
大于等于的24的App中,但是我们没有去适配7.0。那么在调用安装页面,或修改用户头像操作时,就会失败。那么就需要你去适配7.0或是将targetSdkVersion
改为24以下(不推荐)。适配的方法这里就不细讲,大家可以看鸿洋大神的Android 7.0 行为变更 通过FileProvider在应用间共享文件吧 这篇文章。
2.APK signature scheme v2
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。详细看安卓官方说明。
简单地说就是任何方式的篡改APK 文件,在利用了V2签名的apk上会失效。
我所用的Android Studio
目前是2.3.3 在 Gradle
2.2.3时。打包页面是这样
可以看到默认是V1 和V2选中的。
1)只勾选v1签名就是传统方案签署,但是在7.0上不会使用V2安全的验证方式。
2)只勾选V2签名7.0以下会显示未安装,7.0上则会使用了V2安全的验证方式。
3)同时勾选V1和V2则所有版本都没问题。
这里问题就来了,默认全部勾选,按道理所有版本是没有问题的。那么我们为什么还是安装错误?其实是因为我们项目采用了美团的快速生成渠道包方案。这种方案不适用于V2的签名方案。(因为实现思路就是给已有的apk文件中添加空的渠道文件)
解决办法:
1.如果你的渠道较少,可以用gradle
方式的多渠道打包。渠道多的话就不适用了。
2.毕竟V2不是强制的,那么我们要用传统方案签署,可以打开模块级build.gradle
文件,然后将行v2SigningEnabled false
添加到您的版本签名配置中:
android { ... defaultConfig { ... } signingConfigs { release { storeFile file("myreleasekey.keystore") storePassword "password" keyAlias "MyReleaseKey" keyPassword "password" v2SigningEnabled false //<--这里 } } }或者将Gradle
升级为2.3以上。那么打包页面是这样我们可以不勾选V2选项。
3.前两种方法是比较快速的可以解决问题,但是一旦这种安全措施被强制(毕竟我们可以感受到安卓在安全方面的努力,比如权限控制、应用间共享文件),我们怎么办。其实美团早早发现了这个问题,具体看这篇新一代开源Android渠道包生成工具Walle。里面有深度的原理讲解,满满的干货。
2.PopupWindow位置不正确
7.0系统的手机上,PopupWindow弹出位置不正确。有两种可能:
1.我们使用了
update
方法,同时设置了Gravity
(Gravity.NO_GRAVITY
没事)。因为在update
方法中有调用computeGravity
方法去获取Gravity
。(7.0以下没有获取Gravity
进行更新判断)public void update() { // 省略部分代码 final int newGravity = computeGravity(); if (newGravity != p.gravity) { p.gravity = newGravity; update = true; } if (update) { setLayoutDirectionFromAnchor(); mWindowManager.updateViewLayout(mDecorView, p); } }
Android 7.0computeGravity
方法源码private int computeGravity() { int gravity = Gravity.START | Gravity.TOP; if (mClipToScreen || mClippingEnabled) { gravity |= Gravity.DISPLAY_CLIP_VERTICAL; } return gravity;}Android 7.1computeGravity
方法private int computeGravity() { int gravity = mGravity == Gravity.NO_GRAVITY ? Gravity.START | Gravity.TOP : mGravity; if (mIsDropdown && (mClipToScreen || mClippingEnabled)) { gravity |= Gravity.DISPLAY_CLIP_VERTICAL; } return gravity;}很显然在7.0上我们设置的Gravity
被覆盖了。解决就很简单了,不使用update
方法。如果你真的要使用可以参考这篇文章的方法。2.
PopupWindow
高度为MATCH_PARENT
,在显示的时候调用showAsLocation
方法时,PopupWindow
并没有在指定控件的下方显示。如果使用showAsDropDown
,会全屏显示。解决方法:
1.最简单的解决方法就是指定
PopupWindow
的高度为WRAP_CONTENT
, 调用showAsDropDown
方法。2.或者弹出时做一下判断处理(代码来自PopupWindowCompat)
if (Build.VERSION.SDK_INT >= 24) { // Android 7.x中,PopupWindow高度为match_parent时,会出现兼容性问题,需要处理兼容性 int[] location = new int[2]; // 记录anchor在屏幕中的位置 anchor.getLocationOnScreen(location); int offsetY = location[1] + anchor.getHeight(); if (Build.VERSION.SDK_INT == 25) { // Android 7.1中,PopupWindow高度为 match_parent 时,会占据整个屏幕 // 故而需要在 Android 7.1上再做特殊处理 int screenHeight = ScreenUtils.getScreenHeight(context); // 获取屏幕高度 popupWindow.setHeight(screenHeight - offsetY); // 重新设置 PopupWindow 的高度 } popupWindow.showAtLocation(anchor, Gravity.NO_GRAVITY, 0, offsetY);} else { popupWindow.showAsDropDown(anchor);}3.后台优化
小伙伴们都知道在Android中有一些隐式广播,使用这些隐式广播可以做一些特定的功能,如,当手机网络变成WiFi时自动下载更新包等。 但,这些隐式广播会在后台频繁启动已注册侦听这些广播的应用,从而带来很大的电量消耗,为缓解这一问题来提升设备性能和用户体验,在Android 7.0中删除了三项隐式广播,以帮助优化内存使用和电量消耗。
Android 7.0 应用了以下优化措施:
- 在 Android 7.0上 应用不会收到
CONNECTIVITY_ACTION
广播,即使你在manifest清单文件中设置了请求接受这些事件的通知。 但,在前台运行的应用如果使用BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。 - 在 Android 7.0上应用无法发送或接收
ACTION_NEW_PICTURE
或ACTION_NEW_VIDEO
类型的广播。
应对策略:Android 框架提供多个解决方案来缓解对这些隐式广播的需求。 例如,JobScheduler API
提供了一个稳健可靠的机制来安排满足指定条件(例如连入无线流量网络)时所执行的网络操作。 您甚至可以使用 JobScheduler API 来适应内容提供程序变化。另外,大家如果想了解更多关于后台的优化可查阅后台优化。移动设备会经历频繁的连接变更,例如在 Wi-Fi 和移动数据之间切换时。 目前,可以通过在应用清单中注册一个接收器来侦听隐式CONNECTIVITY_ACTION
广播,
让应用能够监控这些变更。 由于很多应用会注册接收此广播,因此单次网络切换即会导致所有应用被唤醒并同时处理此广播。以上内容来自这里
4.多语言特性
首先是官方的API指南:语言和语言区域
变化对比: Android 7.0多语言支持开发浅析
实现功能: Android 实现应用内置语言切换
5.通知栏适配
这里有一篇非常详细的通知栏介绍与适配,分享给大家:Android通知栏介绍与适配总结
6.WebView问题
Android 7.0 WebView 部分机型打不开
Android 7.0 WebView 二级跳转后界面空白
- Android 7.0需要注意的一些坑
- Android 7.0你需要注意的一些坑。
- Android onNewIntent()需要注意的一些问题
- 一些需要注意的
- Android开发的一些需要注意的细节
- Android开发的一些需要注意的细节
- Android开发的一些需要注意的细节
- 一些需要注意的地方
- 一些需要注意的点
- Android游戏开发中需要注意的一些问题
- Android中文出现乱码时需要注意的一些地方
- Android替换字体时需要注意的一些问题
- Android应用开发中,需要注意的一些事项
- Android .mk文件中需要注意的一些宏
- Android系统:SystemUi需要注意的一些知识点
- Android 使用include需要注意的坑
- Android开发中需要注意的坑
- PopupWindow的一些见解以及7.0需要注意的
- leetcode 343. Integer Break
- nodejs(2):前段框架 React 学习设计
- 关于spring读取文件的问题
- 蒜头君打老鼠
- Android系统下根目录下文件
- Android 7.0需要注意的一些坑
- 工作流引擎 Oozie 安装 结合HUE使用
- mysql 查看所有表的搜索引擎
- CUDA学习六:图像的互操作性
- document.execCommand()的用法小记
- CUDA学习七:原子性
- 机器学习中的一些基本概念
- Java多线程的应用场景
- 多线程synchronized使用