Android7.0适配方案
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 和傳統簽名方案來簽署您的應用。詳細看安卓官方說明(https://developer.android.google.cn/about/versions/nougat/android-7.0.html#apk_signature_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則所有版本都沒問題。
?
這里問題就來了,默認全部勾選,按道理所有版本是沒有問題的。
?
那么我們為什么還是安裝錯誤?
?
其實是因為我們項目采用了美團早期的快速生成渠道包(https://tech.meituan.com/mt-apk-packaging.html)方案。這種方案不適用于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(https://tech.meituan.com/android-apk-v2-signature-scheme.html)。里面有深度的原理講解,滿滿的干貨。
?
?
2PopupWindow位置不正確
?
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.0 computeGravity方法源碼
?
?
private int computeGravity() {int gravity = Gravity.START | Gravity.TOP;if (mClipToScreen || mClippingEnabled) {gravity |= Gravity.DISPLAY_CLIP_VERTICAL;}return gravity; }?
Android 7.1 computeGravity方法
?
?
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方法。如果你真的要使用可以參考這篇文章的方法。
?
PopupWindow 在 Android N(7.0) 的兼容性問題
http://www.jianshu.com/p/0df10893bf5b
?
2.PopupWindow高度為MATCH_PARENT,在顯示的時候調用showAsLocation方法時,PopupWindow并沒有在指定控件的下方顯示。如果使用showAsDropDown,會全屏顯示。
?
解決方法:
?
1.最簡單的解決方法就是指定?PopupWindow?的高度為?WRAP_CONTENT, 調用?showAsDropDown方法。
2.或者彈出時做一下判斷處理(代碼來自PopupWindowCompat?https://github.com/tianma8023/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 ,8.0中,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?
https://developer.android.google.cn/reference/android/app/job/JobScheduler.html
提供了一個穩健可靠的機制來安排滿足指定條件(例如連入無線流量網絡)時所執行的網絡操作。?
您甚至可以使用?JobScheduler API?來適應內容提供程序變化。
?
另外,大家如果想了解更多關于后臺的優化可查閱后臺優化。
https://developer.android.google.cn/preview/features/background-optimization.html
?
移動設備會經歷頻繁的連接變更,例如在 Wi-Fi 和移動數據之間切換時。 目前,可以通過在應用清單中注冊一個接收器來偵聽隱式?CONNECTIVITY_ACTION?廣播,?
讓應用能夠監控這些變更。?
?
由于很多應用會注冊接收此廣播,因此單次網絡切換即會導致所有應用被喚醒并同時處理此廣播。
?
以上內容來自這里
https://github.com/crazycodeboy/crazycodeboy.github.io/blob/master/_posts/2016-9-28-Android7.0適配心得.md
?
?
4其他
?
多語言特性
?
首先是官方的API指南:語言和語言區域
http://blog.csdn.net/qq_17766199/article/details/n/guide/topics/resources/multilingual-support.html
變化對比:?Android 7.0多語言支持開發淺析
http://blog.csdn.net/cekiasoo/article/details/53012646
實現功能:?Android 實現應用內置語言切換
http://blog.csdn.net/cekiasoo/article/details/54933135
?
通知欄適配
?
這里有一篇非常詳細的通知欄介紹與適配,分享給大家:Android通知欄介紹與適配總結
http://iluhcm.com/2017/03/12/experience-of-adapting-to-android-notifications/
?
WebView問題
?
-
Android 7.0 WebView 部分機型打不開
http://blog.csdn.net/u012347067/article/details/70829013
-
Android 7.0 WebView 二級跳轉后界面空白
http://www.jianshu.com/p/07b781795b78
?
最后覺得不錯,點個贊吧!
原文鏈接:https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650823906&idx=1&sn=7a0351cad466a4c6cde4fafe9378efc9&chksm=80b7887cb7c0016a69cfd98c2187b76813b161b9dc329df7889d4b78a4f61582fe7328d981a2&scene=21#wechat_redirect
總結
以上是生活随笔為你收集整理的Android7.0适配方案的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Intellij IDEA(Androi
- 下一篇: Android8.0适配方案