MaterialDesign
設計風格ART
虛擬機5.0中使用了recyclerview
代替了listview
,它具備高度解耦,能夠自定義樣式,提供ItemAnimator,ItemDecoration,LayoutLinearLayout
實現豐富多樣的效果,但也有缺點,好比須要自定義列表分割線,列表點擊事件也須要本身實現,列表分隔線經過繼承recyclerview的ItemDecoration
方法安全
Notification Channels
通知渠道是由應用自行定義的通知內容類別,藉助渠道,開發者可讓用戶對不一樣種類的通知進行精細控制,用戶能夠單獨攔截或更改每一個渠道的行爲,而不是統一管理應用的全部通知。 建立通知渠道的步驟:
NotificationChannel
對象,並設置應用內惟一的通知 ID。NotificationManager
中註冊通知渠道對象PIP
Android O
現已支持 Activity
的畫中畫模式。PIP 是一種多窗口顯示模式,多用於視頻播放,即你能夠一邊發微信一邊看視頻。
PIP
模式不會改變 Activity 的生命週期。在指定時間只有最近與用戶交互過的 Activity 爲活動狀態。 該 Activity 將被視爲頂級 Activity。 全部其餘 Activity 雖然可見,但均處於暫停狀態。當一個 Activity 處於 PIP
模式時,其實它是出在暫停狀態,但其內容會繼續展現。API
變動 在 Android O
中新增 PictureInPictureArgs
對象來指明你的 Activity 在 PIP 模式中的屬性,好比長寬比等。 Android O
還新增瞭如下方法來支持 PIP。
(PictureInPictureArgs args)
:將Activity置於 PIP
模式之下。Activity.setPictureInPictureArgs()
:用於更新 Activity 在 PIP
模式下的設置。若是 Activity 正處於 PIP
模式之下,那麼更改的屬性將當即生效。Adaptive Icons
Android O 支持建立自適應圖標,系統能夠基於設備選擇的蒙版將這些圖標顯示爲不一樣形狀。系統還將實現與圖標的自動交互,並在啓動器、快捷方式、設置、共享對話框以及概覽屏幕中使用它們。 在之前的 Android 版本中,圖標大小定義爲 48 x 48 dp。如今你必須按照如下的規範定義你的圖層大小:
Pinning shortcuts
Pinning shortcut
s 是一個比 APP shortcuts
更小的快捷方式,放置於桌面上,用於更快速的打開某一 APP 的某單一任務。Pinning shortcuts
在桌面上可呈現不一樣的圖標顯示。
isRequestPinShortcutSupported()
方法校驗手機是否支持啓動這種快捷方式。ShortcutInfo
對象。Android 7.0
開始,就優化了Android通知欄的體驗。Android P還增長了許多對通知的支持,在P當中,又新增了下述功能:
setData()
來顯示圖像。Notification.Person
類用於標記參與聊天的人,包括他們的頭像和URI。還有其餘的一些API,如今都用Person類做爲標誌參數而不是CharSequence
。 Notification.Builder builder = new Notification.Builder(this, "a"); //新的聊天對象 Notification.Person p = new Notification.Person(); //在MessagingStyle中用Person代替了以往的CharSequence Notification.MessagingStyle messageStyle = new Notification.MessagingStyle(p); Notification.MessagingStyle.Message message = new Notification.MessagingStyle.Message("aaa", 100, p); //能夠顯示圖像了 message.setData(); messageStyle.addMessage(message); builder.setStyle(messageStyle); Notification notification = builder.build();EXTRA_REMOTE_INPUT_DRAFT
來獲取一些信息。 肯定對話是不是羣組對話:您可使用setGroupConversation()
來有目的地將對話標識爲羣組對話或非羣組對話。 爲意圖設置語義動做:setSemanticAction()
方法容許您爲某個動做提供語義含義,如標記爲讀取,刪除,回覆等。Android O
引入了Notification Channels
,可以讓您爲要顯示的每種類型的通知建立一個用戶可自定義的頻道。 Android P經過如下更改簡化了通知渠道設置:
isBlocked()
方法來肯定某個組什麼時候被阻止,不對被阻止的組發送消息。 此外,應用可使用新的getNotificationChannelGroup()
方法查詢當前渠道設置。NotificationManager.Policy
有兩個新的策略常量:PRIORITY_CATEGORY_ALARMS
(按優先級排列)和PRIORITY_CATEGORY_MEDIA_SYSTEM_OTHER
(優先排列媒體,系統和遊戲聲音)Android P
新增了ImageDecoder
類,爲解碼圖像提供了一種更優的方法。由此能夠用ImageDecoder來替換BitmapFactory
和BitmapFactory.Options
。更多使用方法請參見官方API。 String filePath = "test"; File file = new File(filePath); ImageDecoder.Source source = ImageDecoder.createSource(file); ImageDecoder.decodeBitmap(source); ImageDecoder.decodeDrawable(source, (imageDecoder, imageInfo, source1) -> { //裁剪圖像 imageDecoder.setCrop(); //調整大小 imageDecoder.setResize(); }); BitmapFactory.decodeFile(filePath);AnimatedImageDrawable
類來繪製和顯示GIF和WebP動畫圖像。 AnimatedImageDrawable
與AnimatedVectorDrawable
相似,由於AnimatedImageDrawable動畫也是基於RenderThread
工做的。RenderThread
自己在內部使用工做線程進行解碼,所以解碼不會干擾RenderThread
。 這種實現容許您的應用擁有動畫圖像,而無需管理其更新或干擾應用的UI線程。 Drawable d = ImageDecoder.decodeDrawable(...); if (d instanceof AnimatedImageDrawable) { // Prior to start(), the first frame is displayed ((AnimatedImageDrawable) d).start(); }AMS
從Android P開始,只有當Intent flag
中指定了FLAG_ACTIVITY_NEW_TASK
,才容許在非Activity場景啓動Activity。 APP必須擁有FOREGROUND_SERVICE權限,才容許使用前臺服務,不然會拋出異常。 目前不少APP開發者們對Android O的一些後臺限制行爲不太瞭解這些變動,遇到問題可能誤覺得系統問題,因此這裏說到這順便提一下關於Android O對後臺行爲的一些管控。(Background Service)
限制
JobScheduler
startService
方式啓動服務,不然當targetSdk>=26
的狀況下會拋出IllegalStateException
;(Foreground Service)
不會有這個限制,由於前臺服務都會掛一個前臺通知對用戶來講是可見的。Android O新增startForegroundService()
,用於啓動前臺服務,但有一個限制條件就是應用必須服務啓動後5秒以內調用startForeground()
,不然會拋出ANRBOOT_COMPLETED, LOCALE_CHANGED
等。這樣作是爲了省電和性能,防止大量APP經過監聽各類廣播來拉起本身。PMS
重構Package Manger
,減小核心服務的代碼複雜度,將permission,intent
等代碼移到單獨的類, 將user management,dex,shortcuts
等不相關代碼移到子包;儘量操做本地數據,避免加鎖;同時增長單元測試。 PMS在Android O主要改動是優化啓動時間,將操做盡量並行化執行,在Android P上主要改動是掃描過程scanPackageOnly()
, 下一步提取更多的子組件和類,好比Intent resolution,
package verification, dexopt
等,減小修改對象成員的方法。SurfaceFlinger
中引入層級結構用於SurfaceView
,引入Task快照。在Android P上,繼續提高建立對象模型,同步APP Transitions,WindowScope
工具, 過分使用Stack ID, Stack
管理着相似的task和activity,特定的窗口模式,例如HOME_STACK_ID,FULLSCREEN_STACK_ID,FREEFORM_STACK_ID
,這就致使同一個Stack的task和activity不容許有不一樣的窗口模式。新的方案容許有多個WindowContainers
,窗口模式再也不受限於Stack ID。 採用同步的APP Transitions, animations
的過程可再也不須要WMS大鎖。另外Transitions,WindowScope
工具是一個相似於systrace
的工具,可用於方便查看WindowManager和SurfaceFlinger,僅在userdebug
版本開啓,對性能影響較小。Zygote
進程,提前開啓應用進程並將其移至安全容器中,如此一來,應用便作好了隨時啓動的準備Google Play
將要求全部新應用及更新將 targetSdkVersion
設置爲 28 (Android 9 Pie)
。除此之外,當用戶首次運行 API
低級低於 23 (Android Marshmallow及Android 6.0)
的應用時,會受到來自 Android Q 的警告信息。