Android L 的 API 變化

chris發表於2014-07-16

每次Android新版的釋出,Google都會釋出一個API變更報告,概括出對比前一個版本增加、改變、移除的API等資訊。

無論如何,Android L 開發者預覽版差異報告已經隨著javaDoc一起釋出了,在(a poorly-structured ZIP archive)可以看到。我經常回顧這份資料,想看看這和Google I/O上呈現出的有多大差別。Android L 其實有不少很有意義的改變。

注意:這份分析是基於Android L 的開發預覽版,也許在“L”釋出之前很有可能這裡說的一些東西會回到上一版本中,成為Android 5.0的一部分(而且叫什麼名稱也還不知道)。還有,雖然本文只展示一些我們關心的領域,但是強烈建議讀者還是好好去看看實際釋出的版本。

注意2:在Android上,“deprecated”(不推薦)指的是我們認為還有更好的方案可以使用。這裡不能保證以後一定會一直支援這個部分,但是至少現在還是可以使用的。

關於注意事項,下面黑體字說明了版本變更情況:

  • Action Bar 導航:對於所有格式來說,都不建議使用了。這裡就包括了Action Bar Tabs和下拉導航。我也在想如果限制了Action Bar tabs上面的各種操作的話,會怎麼樣呢?

  • 還有部分理由是Action Bar在開發中已經被另一種更容易操作的元件替代。Activity中有一個setActionBar()方法,需要一個Toolbar引數。Toolbar就像一個簡化版的ActionBar一樣,可以放在檢視結構的任何一個地方,相比只能鎖定在頂部的ActionBar來說好多了。

  • Activities也可以“持久化”,還可以跨過重啟。我想這點大概是為了對近期推出的一些功能的擴充套件吧,而副作用就是需要對onSaveInstanceState()方法有新的認識,在Activity上我們需要操作Bundle和一個叫PersistableBundle的東西,也許就是這個東西可以挽救系統重啟帶來的災難。

  • 在ActivityManager中的getRecentTasks()和getRunningTasks()現在也不建議使用了,在Android L或者更高版本中會返回一個結果的子集。

  • BatterryManager現在可以直接獲取電量資訊了,而不用為ACTION_BATTERY_CHANGED註冊一個null型別的receiver。

  • bindService()方法現在需要傳入一個明確的Intent物件,如果你的目標sdk版本設定為L版本或者更高的話,建議使用隱式的Intent,以保證程式碼可讀性,而如果你在服務中使用的話,要注意一下。據Alex Curran說,這會對IAP(in-ap pruchasing)的程式碼整合有影響。

  • 現在我們可以使用getExternalMediaDirs()方法,和getExternalFileDirs()方法類似,但是此方法可以被MediaStore掃描到。

  • 在DevicePolicyManager中已經加入了很多新的功能,可以更多地使用一些高階的API。

  • FragmentBreadCrumbs目前也不建議使用了。使用這個類的朋友們,為你們默哀。

  • 還有這裡新加了一個啟動器,幫助更容易找到相關的應用,不過這也和系統的配置有關(如果沒設定成預設啟動器的話,那是不行的)。

  • MediaStore新增了MediaStore.Audio.Radio,它還沒有正式的文件資料,所以對於流媒體廣播電臺,傳統的廣播電臺或者其它的來說,也會很不明確。

  • 在所有模式中,TOP_LEVEL_*這樣的模式已經不建議使用了。也許這也反映出了頂級域名的數量也在不斷增加。

  • Android上現在有很多關於探測“省電模式”的一些工具,在PowerManager上使用isPowerSaveMode()方法再加上一個ACTION_POWER_SAVE_MODE_CHANGED廣播就可以了。至於是否是在OEM直接納入還是在系統框架中整合,那我就不好說了。

  • 最開始要做的事,像“undeprecated”這樣的字眼,十分明確地指出了在設定時候出現INSTALL_NON_MARKET_APPS,由於安全問題,它已經從設定選項中移回到了這裡,變成全域性的。

  • web設定現在可以控制內容混合模式,可以控制webview是否從安全的來源中載入不安全的內容。

最後,其實Android L 中還有很多變化,尤其是一些大的變更。但是我比較重視的就只有這些。如果讀者有興趣,請自行閱讀本文沒有提到的一些內容。

相關文章