1. 多窗口MultiWindow
????????多窗口MultiWindow,這是Android N里對開發者影響比較大的特性,也是大家疑問比較多的地方。站在開發者的角度其實不必太擔心這個特性會導致我們需要修改很多代碼來適配系統。Google的工程師們也不希望這個特性導致很多應用出現問題,他們更希望的是讓應用都能無縫過度到Android N。據他們測試,目前Google市場中Top 200的應用只有極少數會出現在Android N上因為多窗口導致不能正常使用的情況。退一步講,即使你的應用在Android N的多窗口模式下不能正常運行,可以在manifest中設置resizeableActivity為false,即可禁用多窗口模式,當然在Android N上這個值默認是true.
????????應用如要支持多窗口,也有一些需要注意的地方,最主要的是分辨率的適配。在多窗口模式下,應用的顯示比例不一定是手機屏幕的比例。這里可能會影響到一些代碼,比如有的應用一啟動就全局存儲屏幕的寬高,這在Android N下可能就有問題了,需要開發者做相應的修改。多窗口帶來的另外一個問題是對onStart()和onStop()的處理,在多窗口模式下,Activity的生命周期是不受影響的。但是原來進入onStop()后Activity就不可見了,在Android N中卻還是可見的,這一點在開發的時候需要考慮到。對于音視頻的應用,應該把停止聲音播放的代碼從onPause()移到onStop()里,在onPause()的時候,由于整個應用對用戶仍然可見,音視頻播放不應該暫停。
????????另外值得一提的是畫中畫功能,畫中畫按照Google工程師的說法是專門為Android TV設計的。畫中畫可以使一個Activity在播放視頻的同時,在另外一個中Activity進行其它操作。因為很多視頻應用都需要做小窗播放的功能,目前的做法基本都是用Window Manager實現一個全局浮窗實現的。為此我和另外一個視頻應用的開發者向他們反饋其實在非Android TV平臺也很需要這個功能,Window Manager自身也有許多缺點,比如OEM廠商會加入人為的限制,導致浮窗彈不出來,WindowManager只能加入最頂層的RootView。Google工程師回復使用這種方式實現畫中畫功能其實是對系統的一種Hack,即并非標準的手段,而畫中畫功能可以提供比較清晰的API,并且他們認為我們提的這點確實是一個問題,他們會把這點反饋到開發團隊。
?
2. 對Notification的改進
-
通知消息分組:比較好理解,同一個組的消息在UI展示上歸類到一起;
-
添加快速回復功能:通知在預覽的時候可以直接回復,系統通知欄提供了一個簡單的輸入區域;
-
可以選擇是否隱藏時間:之前的通知欄都是帶時間的,現在可由App自己控制是否需要展現通知消息右下角的時間。
?
3. 省電相關 - Doze和后臺任務優化
? ? ? ? 先說后臺任務優化,不知道大家在開發中沒有自己去接收過ConnectivityManager這個系統服務的connectivity_change廣播,這個廣播是用的最廣泛的,同時也是最容易被濫用的。如果應用中沒有設計一個統一的地方接收系統廣播然后在應用內分發,在單個應用內就會有多個監聽的情況。由于是系統廣播,如果用戶打開的App較多,網絡發生變化時,系統要喚起App來執行一段代碼。但是這時候應用其實不可見的,這里浪費了較多的電量。
????????類似的場景還有很多,比如使用系統相機拍照后系統會發出NEW_VIDEO或者NEW_PHOTO的廣播,如果你的應用現在處于后臺,那么接收此類廣播其實是無意義的,只會浪費電量而已。
????????在Android N中,這類廣播被取消了!實際上所有的隱式廣播(Implicit Broadcast)將來都會逐步取消,在Android N中會先從上文提到的幾個廣播開始。取而代之的是JobScheduler,JobScheduler是大家把自己關注的事件和對應的操作注冊進來,系統會按優先級去調用。如果你的應用在前臺,那么你的任務會被運行,如果是后臺,那么系統就不會跑你的代碼了。這里說的比較通俗,實際系統會制定一定的策略來評估此類情況,更多關于這類廣播的信息,可以查看Google的官方說明。
? ? ? ? 再說說Doze,Doze在Android N上是老樹開新花,因為Doze在Android M上就已經有了。Android M上,在系統屏幕關閉且靜止不動一段時間后,手機會進入Doze模式,只有極少數服務如GCM和加入了白名單的服務,可以保持運行,其它服務,每隔9分鐘會有一個時間窗來執行代碼。舉個例子,如果你是一個鬧鈴應用,在不加入白名單的情況下。10:00進入Doze模式,如果鬧鐘設置在10:09,那么可以響,如果在10:08,對不起,鬧鐘就不能響了。在Android文檔上提到可以用以下方式來申請Alarm不被Doze凍結,不過估計要系統簽名的App才會生效,普通App應該是沒用的。
????????注意,在Android M上Doze的觸發條件是關屏且靜止一段時間。在Android N上把Doze的應用范圍擴大了,只要關屏就進入Doze模式,據Google工程師測試這樣可以節省電量30%,這個改動對需要在后臺做大量工作的應用影響不小。官方給出的解決方案是走Google官方的GCM通道,這個服務有特權不受Doze的影響,但在目前國內環境下這個方案用不了。Google的人說他們會推OEM廠商推出類似GCM的方案。App側能做的就是提示用戶把應用加入白名單,這個方案的成本很高。預計OEM廠商會提供類似手電筒那樣的快捷開關,在需要的時候可以把Doze很方便的關閉掉。
????????Google還開發了battery-historian工具,可以根據系統生成的bug report,分析出詳盡的耗電情況,測試同學又多了一個利器。
????????現場的效果圖,用此工具分析進入Doze模式后,電量消耗馬上變慢了(黑色曲線)。
?
?
4. 運行時權限
????????這個功能并不陌生,國內OEM的系統很多已經做了此功能。Android N這次加上去的是SD卡中內容的權限提示。比如你只需要訪問某一個特定的文件夾,在此之前你要申請整個SD卡的讀/寫權限,據統計會有20%的用戶會因此放棄安裝你的App. Android N之后,你可以在App運行的過程中申請針對某一個目錄的權限。在提問環節,有同學提出只是為了獲取IMEI,Android對這個權限的提醒是讀取手機的狀態,這個權限提醒的太嚇人,Google工程師說會把這個意見反饋上去,不過看樣子大概率不會修改這里。
?
5. NDK的改動
-
NDK的編譯也要拋棄Makefile轉而采用Gradle;
-
NDK受限API采用更改Namespace的方式限制第三方調用,調用受限API會導致應用Crash.
-
?
?
參考文章:
北京Android N開發者會議見聞
http://mp.weixin.qq.com/s?__biz=MzI1MTA1MzM2Nw==&mid=2649796776&idx=1&sn=dc8e2d345b840ae4ec7b71c0bc775ea3&scene=1&srcid=0628FJySPxU8aDC3Ql8VspRR#wechat_redirect
?
如何適配適配 Android N
http://www.trinea.cn/android/android-n-adaptation/
?
?
支持系統級分屏功能:Android_7.0系統更新日志一覽 - 新聞資訊 - 安卓中國
http://www.anzhuo.cn/news/p_13924
?