Android5.0和Android6.0適配

gradle配置項

  1. compileSdkVersion
    用哪一個 Android SDK 版本編譯你的應用。所以咱們強烈推薦老是使用最新的 SDK 進行編譯。在現有代碼上使用新的編譯檢查能夠得到不少好處,避免新棄用的 API ,而且爲使用新的 API 作好準備。
  2. minSdkVersion
    是應用能夠運行的最低要求,也是各大Android應用商店用來判斷用戶設備是否能夠安裝某個應用的標誌之一
  3. targetSdkVersion
    targetSdkVersion 是 Android 提供向前兼容的主要依據
targetSdkVersion < 平臺的API級別 向前兼容舉個栗子:targetSdkVersion==23(6.0),當前設備Android版本7.0,運行程序時用6.0那一套接口。接口:API接口
targetSdkVersion = 平臺的API級別 不啓用兼容性
targetSdkVersion > 平臺的API級別 舉個栗子:targetSdkVersion==23(6.0),當前設備Android版本是 5.0 ,運行程序 用的是5.0那套接口。設備根本到不了6.0

是否是意味着targetSdkVersion越低越好?android

  1. 使用低版本API的其中一個不足,顯示的效果比較OUT,提供的可用的接口或類比較少
  2. 高版本API會針對低版本存在的問題進行改進和完善,擯棄一下不用的類或接口,新增一些方法或屬性,若是你使用的方法是在某個API被另外一個方法代替的話,你可能就得在代碼中區分APP是運行在哪一個版本的Android系統
  3. 應用平臺對targetSdkVersion有要求

minSdkVersion <= targetSdkVersion <= compileSdkVersion

andorid 5.0 新特性

  1. Material Design
  2. 支持64位ART虛擬機。
  3. Overview 多任務視窗。
  4. RecyclerView
  5. 卡片CardView
  6. Palette是一個能夠從圖片(Bitmap)中提取顏色的幫助類,可使UI更加美觀,根據圖片動態的顯示相應的顏色

android 5.0適配

  1. 啓動服務,不支持隱式調用的問題
    解決方案
    1. 使用action調用,必須指定包名啓動(判斷當前當前系統版本)
    2. ComponentName 傳入包名和類名,必須是完整類名路徑。
  2. android5.0 getRunningTasks 和getRunningAppProcesses(僅返回當前應用包名)失效
    解決方案
    1. 第一種辦法,用 UsageStatsManager,須要權限,且只針對系統應用有效,並且要打開設置頁面。
    2. 第二種,不須要權限,外國的一個開源項目:https://github.com/jaredrummler/AndroidProcesses(Android7.0後不生效
  3. backgroundTint屬性只能在5.0以上的api中調用
    解決方案
    1. 咱們能夠新建一個values-v21文件夾,這個裏面聲明的屬性會在api21以上的機器上優先於values文件夾中執行
  4. Android API 21(5.0)引入了一個Drawable的子類VectorDrawable
    解決方案(https://www.jianshu.com/p/0972a0d290e9
    1. minSdkVersion<21:若是想要渲染矢量圖的話必須在app模塊的build.gralde文件裏添加一行代碼:git

      defaultConfig {
           vectorDrawables.useSupportLibrary = true
       }
    2. 在Application或者Activity上加上AppCompateDelegate開啓CompatVectorFromResources支持
    3. Button,TextView,應用矢量圖,保險的是先把矢量圖轉爲selector,而後selector代替矢量圖使用github

  5. Android5.0上 WebView中Http和Https混合問題
    解決方案web

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
        webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW);
    }
  6. WebView cookie 存儲問題apache

    public static void syncCookie(String url, String key) {
         CookieManager cookieManager = CookieManager.getInstance();
         if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
             cookieManager.removeSessionCookies(null);
             cookieManager.flush();
         } else {
             cookieManager.removeSessionCookie();
             CookieSyncManager.getInstance().sync();
         }
         cookieManager.setAcceptCookie(true);
         cookieManager.setCookie(url, key);
     }
  7. JobScheduler和JobService是安卓在api 21中增長的接口(保活),功能更強的鬧鐘api


Android 6.0 適配及新特性

  1. 運行時權限,請務必在運行時檢查和請求權限
    1. Normal Premission:普通權限
    2. Dangerous Permission/Group: 危險權限/組cookie

      android.permission.READ_CALENDAR容許程序讀取用戶日曆數據
      android.permission.WRITE_CALENDAR容許一個程序寫入但不讀取用戶日曆數據
      android.permission.CAMERA,容許訪問攝像頭進行拍照
      android.permission.READ_CONTACTS容許程序讀取用戶聯繫人數據
      android.permission.WRITE_CONTACTS容許程序寫入但不讀取用戶聯繫人數據
      android.permission.GET_ACCOUNTS訪問一個賬戶列表在Accounts Service中
      android.permission.ACCESS_FINE_LOCATION容許一個程序訪問精良位置(如GPS)
      android.permission.ACCESS_COARSE_LOCATION容許一個程序訪問CellID或WiFi熱點來獲取粗略的位置
      android.permission.RECORD_AUDIO容許程序錄制音頻
      android.permission.CALL_PHONE容許一個程序初始化一個電話撥號不需經過撥號用戶界面須要用戶確認
      android.permission.READ_PHONE_STATE 訪問電話狀態
      android.permission.READ_CALL_LOG  查看電話日誌
      android.permission.WRITE_CALL_LOG寫入電話日誌
      android.permission.ADD_VOICEMAIL  容許應用程序添加系統中的語音郵件
      android.permission.USE_SIP  容許程序使用SIP視頻服務
      android.permission.PROCESS_OUTGOING_CALLS   容許應用程序監視、修改、忽略撥出的電話
      android.permission.BODY_SENSORS  容許該應用存取監測您身體情況的傳感器所收集的數據,例如您的心率
      android.permission.SEND_SMS容許程序發送SMS短信
      android.permission.RECEIVE_SMS容許程序監控一個將收到短信息,記錄或處理
      android.permission.READ_SMS容許程序讀取短信息
      android.permission.RECEIVE_WAP_PUSH容許程序監控將收到WAP PUSH信息
      android.permission.RECEIVE_MMS容許一個程序監控將收到MMS彩信,記錄或處理
      android.permission.WRITE_EXTERNAL_STORAGE   容許程序寫入外部存儲,如SD卡上寫文件
      android.permission.READ_EXTERNAL_STORAGE   訪問您設備上的照片、媒體內容和文件app

  2. 取消支持 Apache HTTP
    解決方案:
    android {
    useLibrary 'org.apache.http.legacy'
    }ide

  3. BoringSSL
    請勿連接到並不是 NDK API 組成部分的加密庫,如 libcrypto.so 和 libssl.so函數

  4. 硬件標識符訪問權
    1. WifiInfo.getMacAddress() 方法和 BluetoothAdapter.getAddress() 方法如今會返回常量值 02:00:00:00:00:00。
    2. 如今想訪問硬件標識,如:WiFi和藍牙,必需要有 ACCESS_FINE_LOCATION或者ACCESS_COARSE_LOCATION權限
      WifiManager.getScanResults()
      BluetoothDevice.ACTION_FOUND
      BluetoothLeScanner.startScan()
  5. AudioManager類 再也不支持直接設置音量或將特定音頻流靜音
    1. setStreamSolo() 方法已棄用,您應該改成調用 requestAudioFocus() 方法。
    2. setStreamMute() 方法也已棄用,請改成調用 adjustStreamVolume() 方法並傳入方向值 ADJUST_MUTE 或 ADJUST_UNMUTE
  6. 相機服務變動
    1. 相機服務中共享資源的訪問模式已從以前的「先到先得」訪問模式更改成高優先級進程優先的訪問模式
  7. dlopen failed: "has text relocations"
    1. 解決方案一:將targetSdkVersion 修改成<23
    2. 解決方案二: https://wiki.gentoo.org/wiki/Hardened/Textrels_Guide 經過scanelf / objdump定位存在TEXTREL問題的文件, 以及關鍵代碼在文件中的偏移量, 而後根據偏移量對應的特徵 (函數名 / hard code的絕對地址等), 定位到代碼所在.
    3. 在mk腳本中, 對LOCAL_CFLAGS, 增長-fPIC參數
  8. 電源管理
    在原有的電源管理的基礎上加入了兩種新的狀態:
    1. App Standby—應用待機狀態
    2. Doze 系統休眠狀態
  9. 規範化App Link (應用程序連接)
  10. 指紋識別(統一API)

相關文章
相關標籤/搜索