Android 7.0 Nougat(牛軋糖)—對開發者來說

1654605193 8年前發布 | 11K 次閱讀 安卓開發 Android開發 移動開發

Android 7.0出來了。讓你的app準備迎接最新的android版本吧,支持節省電量和內存,這樣新的系統行為。使用多窗口UI、直接恢復通知以及其他操作來擴展你的app。

android 7.0介紹了各種各樣的新功能給用戶和開發者, 本文重點介紹面向開發者的一些新功能。

確保檢查android 7.0的行為變化,了解有關平臺的變化可能會影響你的app。

如果要了解更多的關于用戶的新功能,請查看www.android.com。

1.支持多窗口

在android 7.0中,我們介紹了在支持多窗口平臺上的一個多任務處理的新功能。

現在,用戶可以一次在屏幕上打開兩個應用。

在手機和平板上運行7.0,用戶可以并排運行兩個應用,或者一個應用位于另一個應用之上在分屏模式的時候。 用戶可以通過拖動兩個應用之間的分隔線來調整app大小。

在android TV上的設備,app可以將自身置于畫中畫模式。當用戶瀏覽或者與其他app交互的時候,允許它們繼續顯示內容。

尤其是在平板上和大屏的設備上,多窗口支持為你提供新的吸引用戶的方式。你甚至能夠讓你的應用進行拖放,用戶可以方便的把內容拖到你的應用,或者從中拖出內容,這是一個非常好的增強用戶體驗的方式。

它是簡單的為你的app添加多窗口支持,并配置它如何處理多窗口顯示。例如,你可以指定activity允許的最小尺寸,從而防止用戶將activity調整到該尺寸以下。你也可以在你的app中禁止多窗口顯示,確保系統將僅以全屏模式顯示你的app。

關于更多的信息,請查看Multi-Window Support的開發者文檔。

2.通知功能的增強

在android 7.0我們重新設計了通知,讓它們更加容易和快速的被使用。以下是一些改變的地方。

(a) 模板的更新 ,我們正在更新的通知模板,強調了英雄的頭像和化身。開發者將能夠利用新的模板,在代碼中做最小的調整。

(b) 消息樣式的自定義 ,你能夠自定義很多和通知相關的用戶界面的標簽,使用MessagingStyle類。你可以配置消息,會話標題,內容視圖。

(c) 綁定通知 ,系統能夠把一組消息放在一起,例如,按照主題消息,顯示這個組。用戶可以適當地進行Dismiss或Archive等操作。如果你已實現Android Wear的通知,那么你已經很熟悉此模式。

(d) 直接回復 ,對于實時通信app,android系統支持內嵌的回復,用戶可以直接快速響應一個短消息或文本消息,直接在通知接口。

(e) 自定義視圖 ,兩個新的API讓你在通知中使用自定義視圖時可以充分利用系統裝飾元素,如通知標題和操作。

3.介紹JIT / AOT編譯

在android 7.0中,我們添加了Just in Time (JIT) 編譯器,對ART 進行代碼分析,它能不斷的提高android app的運行性能。JIT編譯器對android運行組件當前的Ahead of Time (AOT) 編譯器進行了補充,有助于提升運行時性能,節省存儲空間,加快應用更新和系統更新速度。

配置編譯器讓ART管理AOT/JIT編譯每一個app根據實際使用,以及設備上的條件。例如,ART保持著每一個app熱門方法的簡介,并且可以預編譯和緩存這些方法以實現最佳性能。對于應用的其他部分,在實際使用之前不會進行編譯。

除了提高app的性能是關鍵部分。簡介編譯器幫助減少app的內存占用,包括相關的二進制文件。這個功能對于降低設備的內存是很重要的。

ART管理profile-guided編譯時,在最大程度上降低對設備電池的影響。僅當設備處于空閑狀態和充電時才進行編譯,節約時間和電量通過提前執行該工作。

4.快速的app安裝路徑

ART JIT編譯的一個最明顯的好處是提高app安裝和系統更新的速度。在android 6.0中即使是大型的app,也要求幾分鐘來優化安裝的,但是現在只需要幾秒鐘。系統更新也變的很快,自從它不需要優化了。

5.休眠情況下…

android 6.0介紹休眠機制,通過推遲app的cpu和網絡活動來實現省電目的的系統模式,當設備空閑的時候,例如設備放在桌上或抽屜里時。

現在在android 7.0時,休眠機制又前進了一步,隨時隨地的節省電量。任何時候只要屏幕關閉了一段時間,并且設備也沒有插電,休眠就會應用到這個app熟悉的CPU和網絡限制的子集。這意味著用戶節省電量,當他們將設備放入口袋里的時候。

當設備在使用電池時,屏幕關閉片刻后,休眠模式限制網絡訪問,同時延遲作業和同步。在維持著短暫的窗口期間,應用允許網絡訪問,并執行延遲的作業/同步的作業。打開屏幕或者將設備插入電源會使設備退出休眠模式。

當設備再次靜止時,屏幕關閉且使用了電池一段時間。休眠模式應用整個cpu和網絡限制在PowerManager.WakeLock, AlarmManager鬧鐘和GPS/Wi-Fi掃描。

無論設備移動與否,將app在休眠模式的最佳適配是相同。所以,如果你已經更新了你的app,優雅的處理了休眠模式,則一切就緒。如果沒有,請看adapting your app to Doze文檔。

6.Project Svelte:后臺優化

瘦身計劃在持續的優化,盡可能的減少系統和app對RAM的使用,在安卓設備的生態系統的范圍內。在Android 7.0中,瘦身計劃注重優化app在后臺運行的方式。

后臺處理是大多數app的一個重要部分。處理得當,它能夠讓用戶感覺非常神奇,即時地、快速地和有感知力地。處理不得當,后臺處理會不必要地消耗內存(包括電量),同時影響其他app的系統性能。

從Android 5.0開始,JobScheduler已成為執行后臺工作的首選方式,其工作方式有利于用戶。app可以在安排工作的同時允許系統基于內存、電源和連接情況進行優化。 JobScheduler 可實現控制和簡潔性,我們想要所有的app都使用它。

另一個非常好的選擇是GCMNetworkManager,Google Play Services的一部分,提供類似工作調度,能夠很好的兼容在舊的安卓版本。

我們持續擴展JobScheduler和GCMNetworkManager,滿足更多的用戶案例。例如,在Android 7.0中,你能夠立即安排后臺工作,基于可變化的內容提供程序。在同一時間,我們開始反對一些舊的模式,如降低系統性能,特別是低內存設備。

在7.0中,我們移除掉來三個隱式廣播, CONNECTIVITY_ACTION(網絡變化)、ACTION_NEW_PICTURE(相機、拍照、圖片)、and ACTION_NEW_VIDEO(ship)。因為這些廣播可能會一次性喚醒多個app的后臺進程,同時會耗盡內存和電池。如果你的app接收來這些廣播,請例如Android 7.0的優勢,遷移到JobScheduler上,用相關的API來代替。

想要了解更詳細的信息,請看Background Optimizations文檔。

7.SurfaceView

Android 7.0帶來了同步運動的類SurfaceView。提供了在某些情況下比TextureView更好的電池性能,當渲染視頻或者3D視頻時,app滾動和切換視頻位置是,使用SurfaceView比TextureView更省電量。

SurfaceView類在屏幕的影像合成上有更好的電池效率。因為它是復合的專用硬件,分離了app窗口內容。因此,它中間的復制比TextureView更少。

一個SurfceView對象的內容位置現在同步更新到app所包含的內容。這個變化的結果是:簡單的移動或者縮放一個視頻,如果用的是SurfaceView,將不會在view的邊上產生黑色的進度條。

從Android 7.0開始,我們強烈推薦,你要省電的話用SurfaceView代替TextureView。

8.Data Saver(數據保護)

在移動設備的生命周期內,蜂窩數據計劃的成本通常超過設備本身的成本。 對于更多用戶來說,蜂窩數據是一個昂貴的資源,是他們想要保存。

Android 7.0介紹了數據保護模式。一個新的系統服務,能夠幫助app減少蜂窩數據的使用。無論是在計費周期結束時的漫游,還是少量的預付費數據包。數據保護給用戶控制哪個app使用蜂窩數據,同時讓開發者打開Data Saver時,可以提供更多有效的服務。

當一個用戶在設置里面啟用了Data Saver,就可以在設備上計算網絡流量。系統封鎖了后臺數據的使用,同時在前臺的信號app盡可能減少數據的使用,例如限制流的比特率,降低圖片質量,延遲預先的高速緩沖。用戶能設置一個特殊的app白名單,允許后臺計算流量使用,即使是Data Saver打開的時候。

Android 7.0擴展了ConnectivityManager類,可以讓app檢索用戶的Data Saver首選項和監控首選項變更。所有的app應該檢查用戶是否開啟了Data Saver,盡力限制前臺和后臺數據的使用。

9.Vulkan API

Android 7.0集成了Vulkan,一個3D渲染的API。像OpenGL ES一樣,Vulkan 是 3D 圖形和渲染的一項開放標準,由 Khronos Group 維護。

Vulkan是被設計成最小化的驅動CPU的開銷,允許應用程序直接地控制CPU的操作。Vulkan也有更好的并行化,允許多個線程執行工作,如命令緩沖區構建一次。

Vulkan開發工具和依賴都在Android 7.0的NDK中,他們包括:

1.頭

2.驗證層(調試庫)

3.SPIR-V著色編譯器

4.SPIR-V運行時著色器編譯庫

Vulkan只適合已啟用Vulkan硬件的設備上的應用,如Nexus 5X,Nexus 6P,Nexus Player。我們和合作伙伴正在緊密合作,盡可能帶來更多的關于Vulkan的設備。

關于更多信息,請看API documentation。

10.快速設置Tile API

快速設置是一個很普遍地和簡單地顯示設置按鈕和一些其他行為的功能,直接從通知欄下拉。在android 7.0中,我們擴展了快速設置的范圍大小,讓它更富有適用性和方便性。

我們增加了更多的空間來添加快速設置的圖塊,用戶可以向左或者向右滑動,隨意翻閱來顯示它們。我們也可以讓用戶來控制哪些快速設置圖塊的顯示–用戶可以添加刪除這些圖塊,通過拖動和放下他們。

對于開發者來說,android 7.0也增加了一些新的API,讓你能夠定義自己的快速設置圖塊,給用戶能夠很容易的訪問他們的應用,通過這個圖塊來控制、操作它們。

快速設置圖塊保留了控制和行為,它們是急切的要求和頻繁的使用,應該不被使用快捷鍵來運行app。

一旦你定義了你的圖塊,你可以讓他們顯示給用戶看,可通過拖放將圖塊添加到快速設置。

關于更多的創建一個app圖塊的信息,請看Tile文檔。

11.號碼攔截

android 7.0平臺上現在已經支持號碼攔截了,提供了一個framework的API,讓服務提供者維護一個號碼攔截的列表。默認的是SM這個app,這個自帶的app能夠往號碼攔截列表中讀寫數據。這個列表不能夠被其他app訪問。

通過使號碼屏蔽成為平臺的標準功能,android提供了一致的做法,在廣泛的設備上讓app支持號碼攔截。app能夠利用以下的這些好處:

1.能夠攔截電話,也能夠攔截短信

2.通過Backup & Restore(備份和還原)功能可以跨重置和設備上保留屏蔽的號碼

3.多個應用可以使用相同的屏蔽號碼列表

此外,通過自帶app的集成,意味著這個app可以讀取屏蔽號碼列表在android的設備和平臺上,服務商屏蔽掉他們,以阻止不需要的來電和短信,如 VOIP 端點或轉接電話。

關于更多的信息,請看BlockedNumberContract文檔。

12.Call Screening(呼叫過濾)

android 7.0 允許默認的手機應用程序來過濾來電。這個電話app做到這些是實現了新的CallScreeningService,允許手機app執行一個打電話的動作,基于一個到來的電話Call.Details,像這樣:

1.拒絕來電

2.不允許來電到通話記錄

3.不向用戶顯示來電通知

關于更多信息,請查看CallScreeningService文檔。

13.Multi-locale Support, More Languages(多區域、語言支持)

android 7.0能夠讓用戶在設置里面選擇multiple locales,能夠更好的支持雙語言的用例。app能夠使用一個新的API,獲取用戶選擇的區域,然后為多區域設置用戶提供更成熟的用戶體驗–如顯示多語言的搜索結果,不會以用戶知道的語言翻譯網頁。

隨著多區域的支持,android 7.0也擴展了用戶可用的語言范圍。它支持超過25中常用的語言變體,如英語、西班牙語、法語和阿拉伯語。它還支持超過100種新語言。

app能夠得到一個區域設置的列表,用戶通過調用LocaleList.GetDefault()方法。 為支持擴展的區域設置數量,android 7.0正在改變解決資源文件的方式。確保你能夠測試核實你的app如你期望的那樣運行,用新的資源解析邏輯。

學習新的資源解決的行為,有一些訓練測試,請看Multilingual Support。

14.New Emojis(新表情)

android 7.0添加了表情和表情符號相關的功能,包括換膚和支持變量選擇符。如果你的app支持表情, 跟著參考資料,了解表情功能帶來的好處。

1.在插入之前,檢查設備是否包含表情符號。如果要檢查系統字體中有哪些表情,可以用hasGlyph(String)方法。

2.檢查表情符號是否支持變量選擇符。變量表情符號允許你顯示某些表情的顏色單一或者是黑白色。一個移動設備,app應該顯示彩色的表情比黑白的好點。然而,如果你的app在文本中加入了表情,那它應該使用黑白變量。為了確定表情是否有變化,使用一個變量選擇器。對于這個變量完整的字符串列表,閱覽表情變量序列章節,請看Unicode documentation on variations文檔。

3.檢查表情符號是否支持換膚。android 7.0允許用戶按照他們的喜好修改表情符號的膚色。鍵盤app應該提供視覺顯示,有多個膚色可供用戶選擇。如果要確定系統有哪些表情符號膚色可以修改的話,可以使用 hasGlyph(String)方法。你要確定哪些表情符號使用膚色,請看Unicode documentation文檔。

15.ICU4J APIs in Android

android 7.0現在提供了ICUJ API的子集,在android framework的 android.icu  包下。遷移到它是很容易的。最主要的是改變  com.java.icu  命名空間為 android.icu  。如果你在你的app中已經使用了ICU4J捆綁包,切換到android framework中的android.icu的API,可以減少你apk包的大小。

關于更多的ICU4J APIs,請看 ICU4J Support。

16.WebView

1.Chrome + WebView, Together

從android 7.0和Chrome瀏覽器版本51開始,你設備中的Chrome apk將被提供和渲染給android系統的WebViews來使用。到目前為止,這個方式改善了系統內存的使用,也減少了保持WebView的頻帶寬度的要求。(作為獨立的WebView apk將不再更新,只要保留Chrome瀏覽器就行)

在開發者選項WebView implementation中,你可以選擇WebView的提供商。你可以使用任何一款兼容的Chrome瀏覽器版本 (Dev, Beta or Stable),安裝在你的設備上,或者用實現WebView的獨立WebView apk。

2.Multiprocess(多進程)

從android 7.0和Chrome瀏覽器版本51開始,WebView將運行web內容在一個分離的沙盒線程中,當開發者啟用“Multiprocess WebView”選項時。

我們正在尋找資料在兼容性和運行時的性能,能夠在未來的android版本上運行多進程的WebView。在這個版本上,回歸啟動時間,總的內存使用,軟件預計渲染的性能。

如果在多進程模式中發生了意想不到的問題,我們想聽到這些。如果有問題,請在Chromium bug tracker上面和WebView團隊溝通。

3.Javascript run before page load

在android7.0上運行一個app,javascript的context將會被重置,當一個新的頁面加載時。一般地,context通過第一個頁面的加載攜帶到一個新的WebView實例。

開發者可以通過在javascript上注入javascript,在頁面已經加載后,應該執行該腳本。

4.Geolocation on insecure origins(在不安全的來源定位)

在android7.0上運行一個app,定位的API只允許在安全的來源,這個方案的設計是為了保護用戶的隱私信息,當他們使用不安全的連接時。

5.Testing with WebView Beta

WebView定期更新,所以我們推薦你測試下app使用了WebView Beta版的兼容性,在android 7.0上測試WebView的釋放版本,下載安裝Chrome的開發版和Chrome的Beta版,選擇它作為WebView的實現,在開發者選擇的描述下面。請在Chromium bug tracker 上面報告問題,我們將修復問題,并且發布一個新的WebView版本。

17.OpenGL? ES 3.2 API

android 7.0添加了新的framework API來支持OpenGL ES 3.2,包括:

1.除了EXT_texture_sRGB_decode之外,擴展了所有的 Android Extension Pack。

2.針對 HDR 的浮點幀緩沖和延遲著色。

3.BaseVertex 繪圖調用可實現更好的批處理和流媒體服務。

4.強大的緩沖區訪問控制可減少 WebGL 開銷。

OpenGL ES 3.2的API和GLES32一起被提供。當使用 OpenGL ES 3.2時,一定要在清單文件中聲明< uses-feature >標簽和android:glEsVersion屬性。

關于OpenGL ES的更多信息,包括設備在運行時檢查是否支持OpenGL ES,請看OpenGL ES API guide文檔。

18.Android TV Recording(Android TV 錄制)

android 7.0增加了新錄制API,可以錄制和重播從android TV輸入服務獲取的內容。構建在現有時移 API 之上,TV輸入服務能夠控制渠道數據被錄制,怎樣讓會議記錄被保存,通過錄制內容可以管理用戶之間的交互。

更多信息,請看Android TV Recording APIs。

19.Android for Work

在運行android 7.0時,android的工作添加了新的功能和API。下面是一些重要的內容–完整的改變列表,請看Android for Work Updates。

1.Work profile security challenge(工作資料的安全挑戰)

面向 N SDK 的個人資料所有者可以為在工作資料中運行的app指定單獨的安全性挑戰。當用戶試圖打開任何一個app,這個工作挑戰將被展示。成功地完成安全挑戰,解鎖工作文件,并破解它,如果是需要的話。對于資料的所有者,ACTION_SET_NEW_PASSWORD 提示用戶設置一個工作挑戰,ACTION_SET_NEW_PARENT_PROFILE_PASSWORD 提示用戶設置一個設備鎖。

資料所有者針對工作挑戰設置特別的密碼,通過使用 setPasswordQuality(),setPasswordMinimumLength()和相關的方法。(例如:PIN 必須多長,或者是否可以使用指紋解鎖個人資料)。資料所有者也可以設置設備所,用過使用DevicePolicyManager 實例,返回它并調用 getParentProfileInstance()方法。此外,資料所有者可以針對工作挑戰設置自定義憑據屏幕,通過使用setOrganizationColor() 和 setOrganizationName()方法。

2.Turn off work(關閉工作)

在一個有工作概況的設備上,用戶能夠開關這個工作模式。當工作模式關閉的時候,管理用戶的功能臨時關閉,禁用工作資料app,后臺同步,通知。它包括資料所有者的應用程序。當關閉工作模式時,系統顯示永久狀態圖標,以提醒用戶他們無法啟動工作應用。啟動器指示這個工作app和組件無法訪問。

20.Always on V*N(總是打開V*N)

設備的所有者和個人資料的所有者,要確定工作的app總是連接到指定的V*N,在設備boot的時候,系統自動開始啟用該V*N。

新的 DevicePolicyManager 方法有 setAlwaysOnV*NPackage() 和  getAlwaysOnV*NPackage() 。

因為V*N服務能夠直接綁定系統,而不和app交互,V*N客戶端需要針對 Always on V*N處理新的進入點。和以前一樣,服務能夠指定系統,通過intent-filter的action匹配 android.net.V*NService 。

用戶也能夠設置Always on V*N客戶端,實現V*NService的方法,在設置里操作 Settings>More>V*N 。只有API 24才能在設置里開啟這個選項。

21.Customized provisioning(自定義配置)

一個應用程序可以用公司顏色和圖標,來自定義配置文件所有者和設備所有者。

DevicePolicyManager.EXTRA_PROVISIONING_MAIN_COLOR 

定義流程的顏色,

DevicePolicyManager.EXTRA_PROVISIONING_LOGO_URI

定義流程的公司圖標。

22.Accessibility Enhancements(無障礙功能加強)

android 7.0 現在支持視覺設置,在一個新設備啟動的歡迎界面,可以直接設置。對用戶來說,在設備上可以很簡單的發現和配置無障礙功能,包括放大手勢,字體大小,顯示大小和對講系統。

隨著這些無障礙功能更為突出,在開啟這些功能后,你的用戶可能更喜歡你的app。確保在開啟無障礙功能下,測試過你的app。你可以在設置的Settings > Accessibility。

在android 7.0中,無障礙服務可以幫助有運動障礙的用戶觸摸屏幕。新的 API 允許使用人臉追蹤、眼球追蹤、點掃描等功能構建服務,以滿足這些用戶的需求。

關于更多的信息,請看GestureDescription文檔。

23.Direct Boot(直接啟動)

直接啟動改善來設備的啟動時間,讓注冊的應用程序具有有限的功能,即使在機器意外重啟后。例如,當用戶睡覺的時候,一個加密設備重啟,設備注冊來鬧鐘,短信,來電,在重啟后能正常通知用戶。這也意味著無障礙服務在重啟后可以立即使用。

在android 7.0中,直接啟動充分利用文件加密技術,針對系統和應用數據啟用細粒度的加密策略。該系統使用一個加密設備存儲選擇的系統數據和指定注冊的應用程序數據。在默認情況下,證書加密的存儲可用于所有其他系統數據,用戶數據,應用及應用數據。

在啟動時,系統在受限的模式下開始,并且只能訪問加密設備的數據,不能訪問一般的應用和數據。如果你有想在此模式下運行的組件,你可以通過在清單文件設置一個flag,來注冊它們。在重啟后,系統激活注冊的其他數據是不能用的,直到用戶得到證書解密,并且鎖定屏幕。

關于更多信息,請看 Direct Boot。

24.Key Attestation(密鑰認證)

android 7.0引入了密鑰認證,一個新的安全工具,可以幫助你確保密鑰存儲在設備的硬件支持密鑰庫中,緊密的保護來應用程序的用戶的私人信息。通過使用這個工具,從應用程序和駐留在安全硬件中的密鑰的交互中,你能夠獲取額外的信任,甚至root過的設備也可以運行你的應用程序。如果你的應用程序使用從硬件支持的密鑰庫中的密鑰,你應該使用這個工具,尤其是你使用這個密鑰來核實你應用程序的私有信息。

密鑰認證允許你核實RSA 或者 EC 密鑰是否被創建和存儲在設備的硬件支持密鑰庫中,在設備的可信執行環境下(TEE)。該工具也允許你使用關閉設備服務,如你應用程序的后端服務器,確定并有力地驗證密鑰對的使用和有效性。這個功能提供了一個額外的安全級別,來保護密鑰對,甚至某些人root了設備,或者破解來安卓平臺的運行安全。

注意:只有一小部分設備運行在android 7.0上支持硬件級別的密鑰認證,所有的其他設備運行在android 7.0用軟件級別的密鑰認證代替。在你核實產品級別環境中的硬件支持密鑰庫的屬性時,你應該確保設備支持硬件支持的密鑰庫。這樣做,你應該檢查證書鏈是否包含root證書,該證書是有Googleroot證書密鑰和attestationSecurityLevel元素下簽名的,key description數據結構設置了TrustedEnvironment 的安全級別。

關于更多信息,請看 Key Attestation 文檔。

25.Network Security Config(網絡安全配置)

在android 7.0中,應用程序能夠安全地自定義他們的安全連接行為,而不需要代碼修改,通過使用Network Security Config,而不是使用傳統的易出錯的編程API。(例如: X509TrustManager)

支持一下功能:

1. 自定義信任點。 讓一個應用程序自定義哪個官方證書(CA)是信任的安全連接。例如,信任特定的自簽署的證書,或者限制公共的官方證書。

2. 僅調試覆蓋。 讓開發者安全的調試一個安全的連接,而不會增加安裝基礎的風險。

3. 明文流量選擇退出 。讓應用可以防止自身意外使用明文流量。

4. 證書固定 。這是一項高級功能,讓應用可以針對安全連接限制哪些服務器密鑰受信任。

關于更多信息,請看 Network Security Config文檔。

26.Default Trusted Certificate Authority(默認信任的證書機構)

默認情況下,在android 7.0上的應用程序只信任系統提供的證書,而不再信任用戶添加的證書機構。。 如果在android 7.0上的app希望信任用戶添加的CA,則應使用Network Security Config 指定信任用戶CA。

27.APK Signature Scheme v2(apk簽名方案v2)

android 7.0引入了v2的apk簽名方案,一個新的app簽名方案,它提供了更快的app安裝時間和更多針對未授權 APK 文件更改的保護。默認情況下,android studio 2.2和android gradle 插件2.2,他們都能使用v2和傳統的簽名方式來簽名你的應用程序。

雖然我們推薦使用v2的apk簽名方案,這個新方案不是強制的。當使用v2的簽名方案時,如果你的應用程序不能正確的構建,你就可以放棄這個新方案。禁用過程會導致 Android Studio 2.2 和 Android Gradle 2.2 插件只能夠使用傳統簽名方案來簽署你的應用程序。對于只使用傳統方式來簽名,打開build.gradle文件,在你的釋放版本的簽名配置中添加v2SigningEnabled false。

android {
    ...
    defaultConfig { ... }
    signingConfigs {
      release {
        storeFile file("myreleasekey.keystore")
        storePassword "password"
        keyAlias "MyReleaseKey"
        keyPassword "password"
        v2SigningEnabled false
      }
    }
  }

警告:如果你使用v2來簽名你的應用程序,并對應用進一步修改,則app簽名將無效。因為這個原因,請在使用v2簽名之前,使用zipalign工具,而不是之后使用。

關于更多信息,請閱讀介紹如何在 Android Studio 中簽名一個app,以及如何使用 Android Gradle 插件來為簽名app配置build文件。

28.Scoped Directory Access(作用域的目標訪問)

在android 7.0中,app能夠使用新的API來要求訪問指定的額外的存儲目錄,包括可移動媒體上的目錄,如 SD 卡。這個新的API大大地簡化了應用程序怎樣去訪問標準的外部存儲目錄,比如相冊目錄。照片app使用這些API,而不用READ_EXTERNAL_STORAGE,授權訪問所有的存儲目錄,或者存儲訪問框架,讓用戶可以導航到該目錄。

此外,這個新的API簡化了用戶授權訪問外部存儲的步驟。當你使用這個新的API時,系統使用一個簡單的權限UI,清楚詳細地介紹app正在請求訪問的目錄的信息。

關于更多信息,請看Scoped Directory Access文檔。

29.Keyboard Shortcuts Helper(鍵盤快捷鍵幫助)

在android 7.0中,用戶可以按下Meta + 觸發鍵盤快捷鍵屏幕,顯示系統和獲得焦點的app所有可用的快捷鍵。系統會自動從app菜單中檢索出快捷鍵,如果快捷鍵存在的話。你也能夠提供你自己調整的快捷鍵列表,你可以通過重寫onProvideKeyboardShortcuts() 來做到這些。

注意:Meta 鍵現在不是所有的鍵盤上都有,在蘋果公司的鍵盤上,它是Command 鍵;在Windows鍵盤上,它是Windows 鍵;在 Pixel C和 Chrome OS 鍵盤上,它是Search 鍵。

你可以在應用程序的任何地方觸發鍵盤快捷鍵幫助,在相關Activity中調用requestShowKeyboardShortcuts()方法。

30.Custom Pointer API(自定義指針API)

android 7.0引入了自定義指針API,讓你可以自定指針外觀,可見度,行為。這個功能是很有用的,當用戶使用鼠標或者觸摸板和UI對象進行交互的時候。默認的指針使用一個標準的圖標。該API也包括一些高級功能,如改變指針的顯示圖標,在鼠標或者觸摸板移動的時候。

為了設置指針的圖標,重寫View類的 onResolvePointerIcon()方法。該方法使用PointerIcon對象繪制出圖標,來對應于一個特定的事件運動。

31.Sustained Performance API(持續性的API)

長期運行的app的性能可能波動的比較明顯,因為系統會阻止系統芯片下設備組件的溫度限制。這個波動顯示的目的是開發者創建了一個高性能,長期運行的app。

為了解決這些局限性,android 7.0支持了持續的性能模式,啟用OEMs 提供關于長期運行應用的設備性能能力的提示。開發者能夠使用這些提示來預測的大部分設備性能水平,以調整長期應用。

開發者可以在Nexus 6P設備上嘗試這些API。為了使用這些功能,設置持續的性能窗口標志,你想要運行持續的性能模式。設置這個標志位使用Window.setSustainedPerformanceMode() 方法。當窗口丟失焦點時,系統會自動禁用該模式。

32.VR Support(VR支持)

android 7.0增加了新的VR模式的平臺支持和優化,讓開發者可以構建一個高質量的VR體驗給用戶。有大規模的性能增強,包括VR app可以訪問特有的cpu核心。在你的app內部,你可以獲得智能頭部跟蹤和立體聲通知的功能。更重要的是,android 7.0提供了非常低的圖形延遲。

關于在android 7.0構建一個完整的VR app,請看Google VR SDK for Android文檔。

33.Print Service Enhancements(打印服務增強)

在android 7.0 中,打印服務開發者可以公開個人打印機和打印作業的一些信息。

當列出個人打印機列表,一個打印服務現在能夠設置兩種每臺打印機圖標。

1.你可以通過調用setIconResourceId()方法來設置源于資源 ID 的圖標

2.你能夠顯示一個圖標從網絡上,通過setHasCustomPrinterIcon()方法,設置一個回調當圖標被請求的時候,通過onRequestCustomPrinterIcon()方法。

此外,你能夠提供每臺打印機的行動,顯示額外的信息,通過 setInfoIntent()方法。

你可以用一個進度顯示打印機工作的狀態,可以分別通過 setProgress() 和 setStatus()方法來通知打印工作。

34.Frame Metrics API

畫面計算API允許app監視UI渲染性能。API提供了一個功能,暴露Pub/Sub流 API轉換成一幀的時間,在app的當前窗口。這個數據的返回與使用 adb shell dumpsys gfxinfo framestats命令的顯示是一樣的,但不限定于在過去的 120 幀內。

你能夠使用幀計算API來測試UI性能的交互級別,而不需要usb連接。該API允許收集細粒度的數據,調用 adb shell dumpsys gfxinfo 命令。細粒度可能因為系統需要采集app特別交互的數據;系統不需要采集關于完整應用性能的全局概要,或者清除任何全局狀態。你可以使用這個功能來針對app的真實使用案例收集性能數據和捕捉回歸UI性能。

為了監視一個窗口,實現OnFrameMetricsAvailableListener.onFrameMetricsAvailable() 回調方法,并在窗口里面注冊它。

該API提供來FrameMetrics 對象,包含定時數據,其渲染子系統會在一幀生命周期內報告多方面的時間表。支持的指標有:UNKNOWN_DELAY_DURATION、INPUT_HANDLING_DURATION、ANIMATION_DURATION、LAYOUT_MEASURE_DURATION、DRAW_DURATION、SYNC_DURATION、COMMAND_ISSUE_DURATION、SWAP_BUFFERS_DURATION、TOTAL_DURATION 和 FIRST_DRAW_FRAME。

35.Virtual Files(虛擬文件)

在以前的android版本,用戶能夠使用Storage Access Framework 來允許用戶從他們的云存儲帳戶中選擇文件,如: Google Drive。但是,沒有方法來表示文件,通用一個直接的字節碼來表示,每個文件都被要求提供一個輸入流。

android 7.0在Storage Access Framework里面增加來虛擬文件的概念。虛擬文件功能允許你的DocumentsProvider返回一個文檔的Uri,可以通過意圖的 ACTION_VIEW 來使用,即使他們不能直接用字節碼表示。android 7.0也允許你對用戶文件提供備份,虛擬,或者其他的。

應用程序得到虛擬文檔的URI,首先,你要創建一個Intent來打開文件選擇器。由于app不能夠直接打開虛擬文檔,通過使用openInputStream() 方法。你的app不能夠接收任何虛擬文件,如果你包含CATEGORY_OPENABLE屬性的話。

最后,用戶要做一個選擇,系統會調用 onActivityResult() 方法。你的app能夠檢索到虛擬文件的URI,得到一個輸入流,演示代碼如下:

// Other Activity code ...

  final static private int REQUEST_CODE = 64;

  // We listen to the OnActivityResult event to respond to the user's selection.
  @Override
  public void onActivityResult(int requestCode, int resultCode,
    Intent resultData) {
      try {
        if (requestCode == REQUEST_CODE &&
            resultCode == Activity.RESULT_OK) {

            Uri uri = null;

            if (resultData != null) {
                uri = resultData.getData();

                ContentResolver resolver = getContentResolver();

                // Before attempting to coerce a file into a MIME type,
                // check to see what alternative MIME types are available to
                // coerce this file into.
                String[] streamTypes =
                  resolver.getStreamTypes(uri, "*/*");

                AssetFileDescriptor descriptor =
                    resolver.openTypedAssetFileDescriptor(
                        uri,
                        streamTypes[0],
                        null);

                // Retrieve a stream to the virtual file.
                InputStream inputStream = descriptor.createInputStream();
            }
        }
      } catch (Exception ex) {
        Log.e("EXCEPTION", "ERROR: ", ex);
      }
  }

 

 

來自:http://www.androidchina.net/5930.html

 

 本文由用戶 1654605193 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!