天天看點

Android7.0新特性,及Android N适配

新特性部分

Android 7.0 Nougat 提供新功能以提升性能、生産效率和安全性,主要新增了下面的新特性和優化:

Android N 添加了很多新的notifications API,進行了又一次的設計,引入了新的風格。

模闆更新: 開發人員将能夠充分利用新模闆,僅僅需進行少量的代碼調整。

消息樣式自己定義: 新增自己定義樣式、消息回複、消息分組等更加靈活。

捆綁通知: 系統能夠将消息組合在一起(比如,按消息主題)并顯示組。使用者能夠适當地進行 Dismiss 或 Archive 等操作。

直接回複: 對于實時通信應用。Android 系統支援内聯回複,以便使用者能夠直接在通知界面中高速回複短信。

自己定義視圖: 兩個新的 API ,在通知中使用自己定義視圖時能夠充分利用系統裝飾元素,如通知标題和操作。

Android7.0新特性,及Android N适配

手機和平闆: 使用者能夠并排運作兩個應用,或者處于分屏模式時一個應用位于還有一個應用之上。使用者能夠通過拖動兩個應用之間的分隔線來調整應用。

Android TV: 應用能夠将自身置于畫中畫模式。進而讓它們能夠在使用者浏覽或與其它應用互動時繼續顯示内容。

Android7.0新特性,及Android N适配

高速設定”通經常使用于直接從通知欄顯示關鍵設定和操作。非常easy。在 Android N中。已擴充“高速設定”的範圍,使其更加實用更友善。為額外的“高速設定”圖塊加入了很多其它空間,使用者能夠通過向左或向右滑動跨分頁的顯示區域訪問它們。

還讓使用者能夠控制顯示哪些“高速設定”圖塊以及顯示的位置 — 使用者能夠通過拖放圖塊來加入或移動圖塊。

對于開發人員,Android N 還加入了一個新的 API。進而能夠定義自己的“高速設定”圖塊,使使用者能夠輕松訪問應用中的關鍵控件和操作。

Android7.0新特性,及Android N适配

Android 運作元件的 JIT 編譯器最實際的優點之中的一個是應用安裝和系統更新的速度。

即使在Android 6.0 中須要幾分鐘進行優化和安裝的大型應用,如今僅僅需幾秒鐘就能夠完畢安裝。系統更新也變得更快,由于省去了優化步驟。

在 Android N 中。低電耗模式又前進了一步,随時随地能夠省電。

僅僅要螢幕關閉了一段時間。且裝置未插入電源,低電耗模式就會相應用使用熟悉的 CPU 和網絡限制。這意味着使用者即使将裝置放入口袋裡也能夠省電。

Project Svelte在持續改善,以最大程度降低生态系統中一系列 Android 裝置中系統和應用使用的 RAM。在 Android N 中,Project Svelte 注重優化在背景中運作應用的方式。

背景處理是大多數應用的一個重要部分。

處理得當,可實作非常棒的使用者體驗—即時、高速和情境感覺。假設處理不得當,背景處理會毫無必要地消耗 RAM和電池,同一時候影響其它應用的系統性能。

Android N 删除了三項隐式廣播(CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO)

。以幫助優化記憶體使用和電量消耗。

此項變更非常有必要,由于隐式廣播會在背景頻繁啟動已注冊偵聽這些廣播的應用,删除這些廣播能夠顯著提升裝置性能和使用者體驗。

移動裝置會經曆頻繁的連接配接變更,比如在 Wi-Fi 和移動資料之間切換時。眼下,能夠通過在應用清單檔案裡注冊一個接收器來偵聽隐式 CONNECTIVITY_ACTION廣播,讓應用能夠監控這些變更。由于非常多應用會注冊接收此廣播,是以單次網絡切換即會導緻全部應用被喚醒并同一時候處理此廣播。同理,應用能夠注冊接收來自其它應用(比如相機)的隐式ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO 廣播。當使用者使用相機應用拍攝照片時。這些應用即會被喚醒處理廣播。

為減緩這些問題。Android N應用了下面優化措施:

1、面向 Android N 開發的應用不會收到 CONNECTIVITY_ACTION 廣播,即使它們已有清單條目來請求接受這些事件的通知。在前台運作的應用假設使用BroadcastReceiver請求接收通知,則仍能夠在主線程中偵聽CONNECTIVITY_CHANGE。

2、 應用無法發送或接收 ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO廣播。此項優化會影響全部應用,而不僅僅是面向 Android N 的應用。

未來的 Android 版本号還可能會棄用其它隐式廣播以及未綁定的背景服務。有鑒于此。應避免依賴在清單檔案裡聲明的接收器來偵聽隐式廣播或删除此依賴關系,以及避免或删除對背景服務的依賴關系。

Android 架構提供多種解決方式來降低這些隐式廣播或背景服務的必要性。比如,JobScheduler API 提供了一個穩健可靠的機制來安排滿足指定條件(比如連入不按流量計費的網絡)時所運作的網絡操作。甚至能夠使用JobScheduler來響應内容提供程式所發生的變更。

在移動裝置的整個生命周期。蜂窩資料計劃的成本一般會超出裝置本身的成本。對于很多使用者而言。蜂窩資料是他們想要節省的昂貴資源。

Android N推出了Data Saver模式,這是一項新的系統服務,有助于降低應用使用的蜂窩資料,不管是在漫遊,賬單周期即将結束。還是使用少量的預付費資料包。

Data Saver讓使用者能夠控制應用使用蜂窩資料的方式。同一時候讓開發人員打開Data Saver時能夠提供很多其它有效的服務。

Android N 将一項新的 3D 渲染 API Vulkan™ 內建到平台中。就像 OpenGL™ ES 一樣,Vulkan是 3D 圖形和渲染的一項開放标準。由Khronos Group 維護。

Vulkan是全然從零開始設計,以最小化驅動器中的 CPU 開銷,并能讓應用更直接地控制 GPU 操作。Vulkan還同意多個線程同一時候運作工作。如指令緩沖區建構。以獲得更好的并行化。

Vulkan開發工具和庫都已卷入Android NDK。

它們包含:

● 頭

● 驗證層(調試庫)

● SPIR-V 着色程式編譯器

● SPIR-V 運作時着色器編譯庫

● Vulkan僅适用于已啟用Vulkan硬體的裝置上的應用。如 Nexus 5X、Nexus 6P 和Nexus Player。

Android N 如今支援在平台中進行号碼屏蔽。提供架構 API,讓服務提供商能夠維護屏蔽的号碼清單。

預設短信應用、預設手機應用和提供商應用能夠對屏蔽的号碼清單進行讀取和寫入操作。其它應用則無法訪問此清單。

Android N 同意預設的手機應用過濾來電。手機應用運作此操作的方式是實作新的CallScreeningService。該方法同意手機應用基于來電的Call.Details運作大量操作,比如:

● 拒絕來電

● 不同意來電到達通話記錄

● 不向使用者顯示來電通知

Android N 如今同意使用者在設定中選擇多個區域設定,以更好地支援雙語用例。

應用能夠使用新的 API 擷取使用者選擇的區域設定,然後為多區域設定使用者提供更成熟的使用者體驗,如以多個語言顯示搜尋結果,而且不會以使用者了解的語言翻譯網頁。

除多區域設定支援外,Android N 還擴充了使用者可用的語言範圍。它針對經常使用語言提供超過 25種的變體,如英語、西班牙語、法語和阿拉伯語。它還針對 100 多種新語言加入了部分支援。

應用能夠通過調用 LocaleList.GetDefault() 擷取使用者設定的區域設定清單。

為支援擴充的區域設定數量。Android N 正在改變其解析資源的方式。

Android N引入很多其它表情符号和表情符号相關功能,包含膚色表情符号和支援變量選擇符。假設應用支援表情符号,請遵循下面準則,以便能充分利用這些表情符号相關功能優勢。

在插入之前,檢查裝置是否包含表情符号。 若要檢查系統字型中有哪些表情符号。使用hasGlyph(String) 方法。

檢查表情符号是否支援變量選擇符。 變量選擇符能夠呈現一些彩色或黑白的表情符号。在移動裝置上。應用應呈現彩色的表情符号,而不是黑白的。

可是,假設應用顯示嵌入在文本中的表情符号。那應使用黑白變量。若要确定表情符号是否有變量,使用變量選擇符。如需有關支援變量的字元的完整清單,請參閱變量的 Unicode 文檔中的表情符号變量序列部分。

* 檢查表情符号是否支援膚色。* Android N同意使用者依照他們的喜好改動表情符号呈現的膚色。鍵盤應用應為有多個膚色的表情符号提供可視化的訓示。并應同意使用者選擇他們喜歡的膚色。

若要确定哪些系統表情符号有膚色改動器,使用hasGlyph(String) 方法。能夠通過讀取Unicode 文檔來确定哪些表情符号使用膚色。

ICU4J 是一個廣泛使用的開源 Java 庫集合,為軟體應用提供 Unicode 和全球化支援。Android N 在android.icu軟體包下顯示 Android 架構中的 ICU4J API 子集,供應用開發人員使用。

遷移非常easy,主要是須要從com.java.icu命名空間更改為android.icu。假設已在應用中使用 ICU4J 捆綁包,切換到 Android 架構中提供的android.icu API 能夠大量節省 APK 大小。

Android N 加入了架構接口和對 OpenGL ES 3.2 的平台支援。包含:

● 來自 Android 擴充包 (AEP) 的全部擴充(EXT_texture_sRGB_decode除外)。

● 針對 HDR 的浮點幀緩沖和延遲着色。

● Android N同意使用者依照他們的喜好改動表情符号呈現的膚色。鍵盤應用應為有多個膚色的表情符号提供可視化的訓示,并應同意使用者選擇他們喜歡的膚色。若要确定哪些系統表情符号有膚色改動器。使用hasGlyph(String) 方法。

能夠通過讀取Unicode 文檔來确定哪些表情符号使用膚色。

● BaseVertex畫圖調用可實作更好的批處理和流媒體服務。

● 強大的緩沖區訪問控制可降低WebGL開銷。

(面向Android的 Google VR SDK)

Android N 加入了新的VR 模式的平台支援和優化,以使開發人員能為使用者打造高品質移動 VR體驗。新版針對開發人員提供了大量性能增強特性。包含單一緩沖區渲染以及同意 VR 應用訪問某個專屬的CPU 核心。在應用中,能夠享受到專為 VR 設計的平滑頭部跟蹤和立體聲通知功能。

Android7.0新特性,及Android N适配

(API參考 android.accessibilityservice.GestureDescription)

Android N 如今針對新的裝置設定直接在歡迎螢幕上提供“Vision Settings”。這使使用者能夠更easy發現和配置他們裝置上的無障礙功能,包含放大手勢、字型大小、顯示屏尺寸和TalkBack。

使用硬體支援的密鑰庫。可更安全地在 Android 裝置上建立、存儲和使用加密密鑰。

它們可保護密鑰免受 Linux 核心、潛在的 Android 漏洞的攻擊。也可防止從已取得根權限的裝置提取密鑰。

為了讓硬體支援的密鑰庫使用起來更簡單和更安全。Android N 引入了密鑰認證。應用和關閉的裝置可使用密鑰認證以堅決地确定 RSA 或 EC 密鑰對是否受硬體支援、密鑰對的屬性怎樣,以及其使用和有效性有何限制。

應用和關閉的裝置服務能夠通過 X.509 認證證書(必須由有效的認證密鑰簽署)請求有關密鑰對的資訊。

認證密鑰是一個 ECDSA 簽署密鑰,其在出廠時被注入裝置的硬體支援的密鑰庫。

是以。有效的認證密鑰簽署的認證證書可确認硬體支援的密鑰庫是否存在。以及該密鑰庫中密鑰對的具體資訊。

為確定裝置使用安全的官方 Android 出廠映像,密鑰認證要求裝置 bootloader向可信運作環境(TEE)提供下面資訊:

裝置上安裝的作業系統版本号和更新檔級别

● 驗證的啟動公鑰和鎖定狀态。

● 除密鑰認證外,Android N 還推出了指紋綁定密鑰,在指紋注冊時不會撤銷。

适配部分

在Android 7.0 的适配中,遇到了些問題,主要是新特性上的一些變化,須要針對性的做适配。

随着Android版本号越來越高,Android對隐私的保護力度也越來越大。

從Android6.0引入的動态權限控制(Runtime Permissions)到Android7.0的“私有檔案夾被限制訪問”,“StrictMode API 政策”。這些更改在為使用者帶來更加安全的作業系統的同一時候也為開發人員帶來了一些新的任務。怎樣讓你的APP能夠适應這些改變而不是cash,是擺在每一位Android開發人員身上的責任。

● 私有檔案的檔案權限不在放權給全部的應用,使用 MODE_WORLD_READABLE 或 MODE_WORLD_WRITEABLE 進行的操作将觸發 SecurityException。

應對政策:這項權限的變更将意味着你無法通過File API訪問手機存儲上的資料了。基于File API的一些檔案浏覽器等也将受到非常大的影響,看到這大家是不是驚呆了呢,隻是迄今為止,這樣的限制尚不能全然運作。 應用仍可能使用原生 API 或 File API 來改動它們的私有檔案夾權限。 可是,Android官方強烈反對放寬私有檔案夾的權限。 能夠看出收起對私有檔案的訪問權限是Android将來發展的趨勢。

● 給其它應用傳遞 file:// URI 類型的Uri,可能會導緻接受者無法訪問該路徑。 是以,在Android7.0中嘗試傳遞 file:// URI 會觸發 FileUriExposedException。

應對政策:大家能夠通過使用FileProvider來解決這一問題。

● DownloadManager 不再按檔案名稱分享私人存儲的檔案。

COLUMN_LOCAL_FILENAME在Android7.0中被标記為deprecated, 舊版應用在訪問 COLUMN_LOCAL_FILENAME時可能出現無法訪問的路徑。

面向 Android N 或更高版本号的應用在嘗試訪問 COLUMN_LOCAL_FILENAME 時會觸發 SecurityException。

應對政策:大家能夠通過ContentResolver.openFileDescriptor()來訪問由 DownloadManager 公開的檔案。

在Android7.0系統上。Android 架構強制運作了 StrictMode API 政策禁止向你的應用外公開 file:// URI。

假設一項包含檔案 file:// URI類型 的 Intent 離開你的應用,應用失敗,并出現 FileUriExposedException 異常,如調用系統相機拍照,或裁切照片。

應對政策:若要在應用間共享檔案。能夠發送 content:// URI類型的Uri,并授予 URI 暫時訪問權限。 進行此授權的最簡單方式是使用 FileProvider類。 如需有關權限和共享檔案的很多其它資訊,請參閱共享檔案。 ● 給其它應用傳遞 file:// URI 類型的Uri。可能會導緻接受者無法訪問該路徑。 是以。在Android7.0中嘗試傳遞 file:// URI 會觸發 FileUriExposedException。

調用系統相機拍照,裁切照片。

在Android7.0之前,假設你想調用系統相機拍照能夠通過下面代碼來進行:

在Android7.0上使用上述方式調用系統相拍照會抛出例如以下異常:

閃退截圖例如以下:

Android7.0新特性,及Android N适配

這是由于Android7.0運作了“StrictMode API 政策禁”的原因,隻是小夥伴們不用操心,上文講到了能夠用FileProvider來解決這一問題,

如今我們就來一步一步的解決問題。

使用FileProvider

使用FileProvider的大緻過程例如以下:

第一步:在manifest清單檔案裡注冊provider

心得:exported:要求必須為false,為true則會報安全異常。grantUriPermissions:true,表示授予 URI 暫時訪問權限。

第二步:指定共享的檔案夾

為了指定共享的檔案夾我們須要在資源(res)檔案夾下建立一個xml檔案夾,然後建立一個名為“file_paths”(名字能夠随便起,僅僅要和在manifest注冊的provider所引用的resource保持一緻就可以)的資源檔案。内容例如以下:

<code>xml version="1.0" encoding="utf-8"?&gt; &lt;resources&gt; &lt;paths&gt; &lt;external-path path="" name="camera_photos" /&gt; &lt;/paths&gt; &lt;/resources&gt;</code>

代表的根檔案夾: Context.getFilesDir()

代表的根檔案夾: Environment.getExternalStorageDirectory()

代表的根檔案夾: getCacheDir()

心得:上述代碼中path=”“,是有特殊意義的,它代碼根檔案夾。也就是說你能夠向其它的應用共享根檔案夾及其子檔案夾下不論什麼一個檔案了,假設你将path設為path=”pictures”, 那麼它代表着根檔案夾下的pictures檔案夾(eg:/storage/emulated/0/pictures),假設你向其它應用分享pictures檔案夾範圍之外的檔案是不行的。

第三步:使用FileProvider

上述準備工作做完之後,如今我們就能夠使用FileProvider了。

還是以調用系統相機拍照為例,我們須要将上述拍照代碼改動為例如以下:

上述代碼中主要有兩處改變:

1、将之前Uri的scheme類型為file的Uri改成了有FileProvider建立一個content類型的Uri。

2、加入了intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);來對目标應用暫時授權該Uri所代表的檔案。

心得:上述代碼通過FileProvider的Uri getUriForFile (Context context, String authority, File file) 靜态方法來擷取Uri,該方法中authority參數就是清單檔案裡注冊provider的android:authorities=”com.jph.takephoto.fileprovider”。 對Webserver如tomcat。IIS比較熟悉的小夥伴,都僅僅知道為了站點内容的安全和高效,Webserver都支援為站點内容設定一個虛拟檔案夾,事實上FileProvider也有異曲同工之處。

将getUriForFile方法擷取的Uri列印出來例如以下:

當中camera_photos就是file_paths.xml中paths的name。

由于上述指定的path為path=”“,是以content://com.jph.takephoto.fileprovider/camera_photos/代表的真實路徑就是根檔案夾,即:/storage/emulated/0/。

content://com.jph.takephoto.fileprovider/camera_photos/temp/1474960080319.jpg代表的真實路徑是:/storage/emulated/0/temp/1474960080319.jpg。

裁切照片代碼:

和拍照一樣。上述代碼在Android7.0上相同會引起android.os.FileUriExposedException異常,解決的方法就是上文說說的使用FileProvider。

然後。将上述代碼改為例如以下就可以:

另外,裁切照片推薦大家使用開源工具庫TakePhoto,

TakePhoto是一款在Android裝置上擷取照片(拍照或從相冊、檔案裡選擇)、裁剪圖檔、壓縮圖檔的開源工具庫。