Android 新特性介紹
本文主要介紹Android 5.0之後的新特性.
一.Android 5.0 新特性
RecyclerView: 提供一種插拔式的體驗,它具有高度的解耦、異常的靈活和更高的效率,通過設置它提供的不同LayoutManager、ItemDecorration、ItemAnimation可實現更加豐富多樣的效果。
CardView:繼承自FrameLayout類,所以子控制項設置原則和FrameLayout一樣。並且可以設置圓角和陰影。
全新的Material Design 設計風格。
支持64位ART 虛擬機。
Face unlock 面部解鎖。
二.Android 6.0 新特性
應用許可權管理
App Links
取消支持Apache Http客戶端
2.1應用許可權管理介紹
從Android 6.0(API 23)開始,對系統許可權做了很大的改變。在之前用戶安裝APP前,只是把APP需要使用的許可權列出來給用戶告知一下,APP安裝後都可以訪問這些許可權。從6.0開始,一些敏感許可權,需要在使用時動態申請,並且用戶可以選擇拒絕授權訪問這些許可權,已授予過的許可權,用戶也可以去APP設置頁面去關閉授權。這對用戶來說提高了安全性,可以防止一些應用惡意訪問用戶數據,但是對於開發來說,也增加了不少工作量,這塊不做適配處理的話,APP在訪問許可權的時候會容易crash。
許可權主要分為normal、dangerous、signature和signatureOrSystem四個等級,常規情況下我們只需要了解前兩種,即正常許可權和危險許可權。
正常許可權
危險許可權&許可權組
系統根據許可權用途又定義了許可權組,每個許可權都可屬於一個許可權組,每個許可權組可以包含多個許可權.例如聯繫人許可權組,包含讀取聯繫人、修改聯繫人和獲取賬戶三個許可權.
如果應用申請訪問一個危險許可權,而此應用目前沒有對應的許可權組內的任何許可權,系統會彈窗提示用戶要訪問的許可權組(注意不是許可權).例如無論你申請READ_CONTACTS還是WRITE_CONTACTS,都是提示應用需要訪問聯繫人信息.
如果用戶申請訪問一個危險許可權,而應用已經授權同許可權組的其他許可權,則系統會直接授權,不會再與用戶有交互.例如應用已經請求並授予了READ_CONTACTS許可權,那麼當應用申請WRITE_CONTACTS時,系統會立即授予該許可權。
單個運行許可權請求
目前TCL電視應用的解決方法:
將targetSDKVersion人為的降到小於23,這樣就變成了還是默認使用許可權,但是這種並不是Google所推薦使用的。
TV端弊端:不能應用Android 最新的特性,如畫中畫與多窗口。
手機端弊端:如果用戶手動進入設置關閉該應用打開攝像頭的許可權,可能會導致無法啟動攝像頭,且沒有提示,這樣的用戶體驗顯然不好。
什麼情況下需要申請動態許可權:
滿足兩個條件:①6.0以上系統 ②編譯版本(compileSdkVersion)API23以上
1.檢查許可權
應用每次需要危險許可權時,都要判斷應用目前是否有該許可權。
2.請求許可權
3.處理請求許可權響應權
多個許可權請求
1.申明許可權
2.檢查許可權
3.處理請求許可權響應
2.2 App Links
App Links是Android M以上的特有功能,即實現了auto-verify支持用戶點擊一個鏈接即可喚起APP,而不用像以往版本中需要點擊一個選擇框列表。為了使自己的應用支持App Links,我們常需要以下三個步驟:
在manifest中創建Intent filter
在Activity中編寫對應的代碼邏輯處理收到的url links
通過配置證書文件,關聯網頁和應用
https://www.jianshu.com/p/44d825c77bd5
https://www.jianshu.com/p/d26d62a992f8
2.3 移除了對Apache HTTP 的支持
Android 6.0 版移除了對 Apache HTTP 客戶端的支持。如果您的應用使用該客戶端,並以 Android 2.3(API 級別 9)或更高版本為目標平台,請改用 HttpURLConnection 類。此 API 效率更高,因為它可以通過透明壓縮和響應緩存減少網路使用,並可最大限度降低耗電量。要繼續使用 Apache HTTP API,您必須先在 build.gradle 文件中聲明以下編譯時依賴項:
android {
}
三.Android 7.0 新特性
改進的Java 8 語言支持
Google Assistant
多窗口模式
FileProvider
3.1 多窗口
1、一般情況下,版本target大於24,App默認都允許分屏模式。但有的開發者認為自己的App只有在全屏狀態下才能正常使用,要是被分屏的話用起來會很難受,這時候就得對該App禁用分屏模式。具體操作是在AndroidManifest.xml的application節點添加屬性android:resizeableActivity="false",表示應用頁面不接受分屏;如此一來,即使用戶開啟了分屏模式,切換到該應用時仍會強制回到全屏模式。
2、App頁面從全屏模式切換到分屏模式,它的Activity生命周期會經歷銷毀後重建的過程,如果開發者想保持App頁面在分屏前的模樣,則需給該頁面的activity節點加上以下的屬性描述,告知系統不要對這個頁面動手動腳:android:configChanges="screenLayout|orientation"
3、對於視頻播放頁面,建議Activity代碼不在onPause方法中暫停播放視頻,而應當在onStop方法中暫停播放,並在onStart方法中恢復播放視頻。
4、App運行過程中,若想獲知當前是否處於分屏模式,則可調用isInMultiWindowMode方法,該方法返回true表示處於分屏模式,返回false表示處於全屏模式。
5、每當進入多窗口,或者退出多窗口的時候,應用會觸發Activity頁面的onMultiWindowModeChanged方法。通過重載該方法,開發者可以即時收到分屏與全屏的切換通知。
3.1.1 多窗口-分屏時Activity的生命周期
三種情況
1.當前顯示自己的應用頁面,長按多任務鍵時出現分屏
onMultiWindowModeChanged(true)->onPause-onStop->onDestroy->onCreate->onStart- >onResume->onPause
2.分屏時長按多任務鍵,全屏顯示自己的應用時
onStop->onDestroy->onCreate->onStart->onResume>onPause>onMultiWindowModeChanged(false)->onResume
3.當前顯示其他應用,按多任務鍵出現自己的應用時
onMultiWindowModeChanged(true)->nDestroy->onCreate->onStart->onResume需
3.2 File Provider (應用共享文件)
Android 7.0強制啟用了被稱作 StrictMode的策略,帶來的影響就是你的App對外無法暴露file://類型的URI了。
如果你使用Intent攜帶這樣的URI去打開外部App(比如:打開系統相機拍照),那麼會拋出FileUriExposedException異常。
FileProvider使用大概分為以下幾個步驟:
manifest中申明FileProvider
res/xml中定義對外暴露的文件夾路徑
生成content://類型的Uri
給Uri授予臨時許可權
使用Intent傳遞Uri
https://www.jianshu.com/p/55eae30d133c
四. Android 8.0 新特性
1. 畫中畫模式 — PIP
2. 自適應圖標 — Adaptive Icons
3. 後台限制
4. 安裝限制
5. Smart Text Selection
6. 應用加速
7. TensorFlow Lite
4.1 畫中畫模式(Picture in Picture)
1.Activity默認不支持該模式。若想讓App頁面能夠顯示畫中畫的效果,則必須給activity節點添加supportsPictureInPicture:="true「
App頁面從全屏模式切換到畫中畫模式,它的Activity生命周期也會經歷銷毀後重建的過程,如果開發者想保持App頁面不被重建,則需給該頁面的activity節點加上android:configChanges="screenLayout|orientation"
2.對於視頻播放頁面,Activity代碼同樣不在onPause方法中暫停播放視頻,而應當在onStop方法中暫停播放,並在onStart方法中恢復播放視頻。
3. App若想獲知當前是否處於畫中畫模式,則可調用isInPictureInPictureMode方法,該方法返回true表示處於畫中畫模式,返回false表示處於全屏模式。
4.每當App進入畫中畫,或者退出畫中畫的時候,應用會觸發Activity頁面的onPictureInPictureModeChanged方法。通過重載該方法,應用可以實時收到畫中畫與全屏的切換通知,並在此控制控制項的展示。比如進入畫中畫時,隱藏除視頻畫面之外的所有控制項;退出畫中畫時,則恢復這些控制項的正常顯示.
5.進入畫中畫模式生命周期如下圖:
6.啟動畫中畫模式始,一些
7.重寫onPictureInPictureModeChanged方法
4.2 Android 8.0適配問題
1.Android 8.0 廣播限制
在Android 8.0的平台上,應用不能對大部分的廣播進行靜態註冊,也就是說,不能在AndroidManifest文件對有些廣播進行靜態註冊,這裡必須強調是有些廣播,因為有些廣播還是能夠註冊的。比如,經過樓主測試,對接收Android 開機的廣播通過靜態註冊還是能夠正常接收的.
解決辦法
1. 靜態註冊,也就是說在AndroidManifest文件中對BroadcastReceiver進行註冊,通常還會加上action用來過濾。
2. 動態註冊,調用Context中的registerReceiver對廣播進行動態註冊,使用unRegisterReceiver方法對廣播進行取消註冊的操作。
2.許可權申請注意問題
8.0以前,申請一個子許可權會自動獲取許可權組中其他子許可權。組內其他子許可權可以直接使用。
8.0以後申請一個子許可權,組內其他子許可權不會自動獲取。使用組內其他子許可權的時候。需要再次申請。(但是這種情況不會彈出系統的許可權申請框)。
3.應用安裝:未知來源應用安裝
1.在清單文件中增加請求安裝許可權
2.我們還需要在代碼裡面對許可權進行處理 首先用canRequestPackageInstalls()方法判斷你的應用是否有這個許可權
3.如果有這個許可權,再去執行安裝,沒有這個許可權,需要用戶跳轉到設置界面中自己去打開許可權
4.然後在onActivityResult中去接收結果:許可權,已授予過的許可權,用戶也去


TAG:Android代碼Share |