API級別:17
Android 4.2(JELLY_BEAN_MR1)是Jelly Bean版本的更新,為用戶和應用程序開發人員提供了新功能。本文檔向開發人員介紹最顯著和有用的新API。
作為應用程序開發人員,您應該盡快從SDK Manager中下載Android 4.2系統映像和SDK平臺。如果您沒有運行Android 4.2的設備來測試您的應用,請使用Android 4.2系統映像在Android模擬器上測試您的應用。然后針對Android 4.2平臺構建您的應用程序,以開始使用最新的API。
### **重要的行為變化**
如果您以前發布過Android應用,請注意以下可能會影響您應用行為的更改:
* 內容提供者不再默認導出。也就是說,該android:exported屬性的默認值是現在“false"。如果其他應用能夠訪問您的內容提供商很重要,那么您現在必須明確設置android:exported="true"。
這種變化僅僅發生在你設置任何影響android:targetSdkVersion或android:minSdkVersion17或更高。否則,“true" 在Android 4.2及更高版本上運行時,默認值仍然是。
* 與以前版本的Android相比,如果您的應用請求權限但不請求權限,則用戶位置結果可能不太準確。 ACCESS_COARSE_LOCATIONACCESS_FINE_LOCATION
當您的應用請求粗略位置(而不是精細位置)的權限時,為了滿足用戶對隱私的期望,系統將不會提供比城市街區更準確的用戶位置估計。
* 現在定義的一些設備設置Settings.System是只讀的。如果您的應用程序試圖寫入Settings.System已經移動到其中的設置的更改Settings.Global,則在Android 4.2和更高版本上運行時,寫入操作將以無提示方式失敗。
即使你的價值android:targetSdkVersion,并android:minSdkVersion為超過17時,你的應用程序是不能修改已移動到設置Settings.Global在Android 4.2及更高版本上運行時。
* 如果您的應用程序使用WebView,Android 4.2添加了一個額外的安全層,以便您可以更安全地將JavaScript綁定到您的Android代碼。如果您將其設置 targetSdkVersion 為17或更高,那么現在必須將@JavascriptInterface注釋添加到您希望可用于JavaScript的方法(該方法也必須是公共的)。如果您沒有提供注釋,則WebView 在運行Android 4.2或更高版本時,您的網頁無法訪問該方法。如果將該值設置 targetSdkVersion 為16或更低,則不需要注釋,但我們建議您更新目標版本并添加注釋以提高安全性。
閱讀更多關于將[JavaScript代碼綁定到Android代碼的信息](https://developer.android.com/guide/webapps/webview.html#BindingJavaScript)。
#### **夢話**
Daydream是Android設備的全新交互式屏幕保護模式。當設備插入擴展塢或設備在插入充電器時閑置(而不是關閉屏幕)會自動激活。Daydream一次顯示一個夢,可能是一個純粹的視覺化的被動的顯示,一觸即發,或者可能是交互式的,并且響應整個輸入事件。你的夢想運行在你的應用程序的過程中,并可以完全訪問Android UI工具包,包括視圖,布局和動畫,因此它們比動態壁紙或應用程序小部件更加靈活和強大。
你可以通過實現一個子類來為Daydream創建一個夢想DreamService。這些DreamServiceAPI被設計成與那些API類似Activity。要指定自己的夢想的UI,通過一個布局資源ID或View以setContentView()在任何時候你有一個窗口后,如從onAttachedToWindow() 回調。
的DreamService類提供在底座的頂部其他重要生命周期回調方法Service的API,如onDreamingStarted(),onDreamingStopped(),和onDetachedFromWindow()。您無法DreamService從您的應用程序啟動,系統會自動啟動。
如果您的夢想是交互式的,您可以從夢想開始一個活動,將用戶發送到您的應用程序的完整用戶界面以獲取更多細節或控制。您可以使用finish()結束夢想,以便用戶可以看到新的活動。
為了使您的白日夢可用于系統,請在清單文件中聲明DreamService一個`<service>`元素。然后您必須包含一個意向過濾器與行動"android.service.dreams.DreamService"。例如:
~~~
<service android:name=".MyDream" android:exported="true"
android:icon="@drawable/dream_icon" android:label="@string/dream_label" >
<intent-filter>
<action android:name="android.service.dreams.DreamService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>
~~~
還有其他一些有用的方法DreamService 要注意:
* setInteractive(boolean)控制夢是否接收到輸入事件或者在用戶輸入時立即退出。如果夢想是交互式的,用戶可以使用“ 返回”或“ 主頁”按鈕退出夢想,或者您可以打電話 finish()來停止夢想。
* 如果你想要一個完全身臨其境的顯示器,你可以調用setFullscreen()隱藏狀態欄。
* 在Daydream開始之前,顯示屏會變暗,向用戶發出信號,表示空閑超時正在接近。調用setScreenBright(true)允許您以通常的亮度設置顯示。
有關更多信息,請參閱DreamService文檔。
#### **二次顯示**
Android現在允許您的應用在通過有線連接或Wi-Fi連接到用戶設備的其他屏幕上顯示唯一內容。為輔助顯示創建獨特的內容,擴展Presentation 類并實現onCreate()回調。在其中 onCreate(),通過調用來為輔助顯示器指定您的UI setContentView()。作為Dialog該類的擴展,Presentation該類提供了應用程序可以在輔助顯示中顯示唯一UI的區域。
要檢測可顯示的輔助顯示器,請Presentation使用DisplayManager或MediaRouter API。盡管DisplayManagerAPI允許枚舉多個可以同時連接的顯示器,但通常應該使用它MediaRouter來快速訪問系統的默認顯示器以進行演示。
要獲得演示文稿的默認顯示,請調用MediaRouter.getSelectedRoute()并傳遞它 ROUTE_TYPE_LIVE_VIDEO。這將返回一個MediaRouter.RouteInfo描述系統當前選擇的視頻演示路線的對象。如果MediaRouter.RouteInfo不為空,打電話 getPresentationDisplay(),以獲得Display代表相連接的顯示器。
然后,您可以通過將Display對象傳遞給您的Presentation類的構造函數來顯示您的演示文稿。您的演示文稿現在將顯示在輔助顯示屏上。
要在運行時檢測到新顯示器已連接,請創建一個實例,MediaRouter.SimpleCallback在該實例中實現onRoutePresentationDisplayChanged()回調方法,在連接新的演示文稿顯示器時系統將調用該方法。然后注冊MediaRouter.SimpleCallback通過將其傳遞到MediaRouter.addCallback()與沿ROUTE_TYPE_LIVE_VIDEO路徑類型。當你接到電話時 onRoutePresentationDisplayChanged(),只需MediaRouter.getSelectedRoute()按上面提到的那樣打電話。
要進一步優化Presentation二級屏幕中的用戶界面,可以通過指定應用于應用程序或活動的android:presentationTheme屬性來應用不同的主題`<style>`。
請記住,連接到用戶設備的屏幕通常具有更大的屏幕尺寸,并且可能具有不同的屏幕密度。由于屏幕特征可能不同,因此應提供專門針對較大顯示屏進行優化的資源。如果您需要從您的請求額外資源Presentation,調用getContext().getResources()以獲取Resources顯示對應的對象。這將從您的應用程序中提供最適合輔助顯示器的屏幕尺寸和密度的適當資源。
有關更多信息和一些代碼示例,請參閱Presentation 類文檔。
#### **鎖屏小部件**
Android現在允許用戶將應用程序小部件添加到鎖定屏幕。要使您的App Widget可用于鎖定屏幕,請將該android:widgetCategory屬性添加到指定的Widget文件中AppWidgetProviderInfo。這個屬性支持兩個值:home_screen 和keyguard。默認情況下,該屬性設置為home_screen用戶可以將您的應用程序小部件添加到主屏幕。如果您希望您的應用程序小部件在鎖定屏幕上也可用,請添加keyguard值:
~~~
<appwidget-provider xmlns:android="http://schemas.android.com/apk/res/android"
...
android:widgetCategory="keyguard|home_screen">
</appwidget-provider>
~~~
您還應該在具有該android:initialKeyguardLayout屬性的鎖定屏幕上指定應用程序窗口小部件的初始布局。它的工作方式android:initialLayout與之相同,因為它提供的布局可以立即顯示,直到應用程序窗口小部件初始化并能夠更新布局為止。
有關為鎖定屏幕構建應用程序小部件的更多信息,包括在鎖定屏幕上正確設置應用程序小部件的大小,請參閱應用程序小部件指南。
#### **多個用戶**
Android現在允許可共享設備(如平板電腦)上的多個用戶空間。設備上的每個用戶都有自己的一套帳戶,應用程序,系統設置,文件以及任何其他用戶相關的數據。
作為一名應用程序開發人員,為了讓您的應用程序能夠與單個設備上的多個用戶正常協作,您不需要做任何其他的事情。無論設備上可能存在多少用戶,您的應用為特定用戶保存的數據都與應用為其他用戶保存的數據分開存放。系統會跟蹤哪些用戶數據屬于您的應用正在運行的用戶進程,并讓您的應用僅訪問該用戶的數據,并且不允許訪問其他用戶的數據。
#### **將數據保存在多用戶環境中**
無論何時您的應用程序保存用戶首選項,創建數據庫或將文件寫入用戶的內部或外部存儲空間,只有以該用戶身份運行時才能訪問該數據。
要確定您的應用程序在多用戶環境中的行為正確,請不要使用硬編碼路徑引用您的內部應用程序目錄或外部存儲位置,而是始終使用適當的API:
* 要訪問內部存儲,使用getFilesDir(),getCacheDir()或openFileOutput()。
* 要訪問外部存儲,請使用getExternalFilesDir()或getExternalStoragePublicDirectory()。
無論您使用哪種API來為給定用戶保存數據,在以不同用戶身份運行時都無法訪問數據。從您的應用程序的角度來看,每個用戶都在一個完全獨立的設備上運行。
#### **識別多用戶環境中的用戶**
如果您的應用想要識別獨特的用戶,例如收集分析或創建其他帳戶關聯,則應遵循建議的做法以識別獨特的安裝。通過UUID在您的應用第一次啟動時創建一個新的應用,無論有多少用戶在單個設備上安裝您的應用,您都一定會獲得用于跟蹤每個用戶的唯一ID。或者,您可以保存從您的服務器獲取的本地令牌或使用Google Cloud Messaging提供的注冊ID 。
請注意,如果您的應用程序請求其中一個硬件設備標識符(例如WiFi MAC地址或SERIAL數字),則它們將為每個用戶提供相同的值,因為這些標識符與硬件綁定,而不是用戶綁定。更不用說這些標識符引入的其他問題,如在識別App Installations博客文章中討論的。
#### **新的全局設置**
系統設置已更新,以支持多個用戶Settings.Global。這些設置的集合類似于Settings.Secure設置,因為它們是只讀的,但可以在設備上的所有用戶空間中全局應用。
一些現有的設置是從這里要么搬遷Settings.System或Settings.Secure。如果您的應用程序當前正在對之前在Settings.System (如AIRPLANE_MODE_ON)中定義的設置進行更改,那么您應該期望這樣做將無法在運行Android 4.2或更高版本的設備上運行,如果這些設置已移至Settings.Global。您可以繼續閱讀其中的設置 Settings.Global,但是由于設置不再適合應用程序更改,因此嘗試這樣做會失敗,系統會在Android 4.2上運行應用程序時向系統日志中寫入警告,或者更高。
#### **RTL布局支持**
Android現在提供了幾個API,允許您構建用戶界面,這些界面可以優雅地轉換布局方向,以支持使用從右到左(RTL)UI和閱讀方向(如阿拉伯語和希伯來語)的語言。
要開始支持應用程序中的RTL布局,請將該android:supportsRtl屬性設置為<application>清單文件中的元素并進行設置“true"。啟用此功能后,系統將啟用各種RTL API,以RTL布局顯示您的應用程序。例如,操作欄將在右側顯示圖標和標題,在左側顯示操作按鈕,您使用框架提供的View類創建的任何布局也將被顛倒。
如果在使用RTL布局進行顯示時需要進一步優化應用程序的外觀,則有兩個基本的優化級別:
1. 將左側和右側布局屬性轉換為開始和結束導向布局屬性。
例如,用來android:layout_marginStart 代替android:layout_marginLeft和android:layout_marginEnd代替 android:layout_marginRight。
所述RelativeLayout類還提供了相應的布局屬性來替換左/右等位置,android:layout_alignParentStart以替換android:layout_alignParentLeft和android:layout_toStartOf代替 android:layout_toLeftOf。
2. 或者為RTL布局提供完整的優化,可以使用ldrtl資源限定符(ldrtllayout-direction-right-to-left)提供完全獨立的布局文件。例如,您可以將您的默認布局文件保存在 res/layout/您的RTL優化布局中res/layout-ldrtl/。
在ldrtl預選賽是偉大的繪圖資源,這樣就可以提供在相應的讀取方向的方向面向圖形。
各種其他API可用于整個框架,以支持RTL布局,例如在View類中,以便您可以實現自定義視圖和Configuration查詢當前布局方向的正確行為。
注意:如果您使用的是SQlite,并且表名或列名僅為“數字”,請注意:String.format(String, Object...)如果設備已設置為阿拉伯語語言環境,則使用會導致數字已轉換為阿拉伯數字的錯誤。必須使用String.format(Locale,String,Object...)以確保數字保存為ASCII。也可以使用String.format("%d", int)而不是 String.valueOf(int)用于格式化數字。
#### **嵌套片段**
您現在可以將碎片嵌入到碎片中。這對于您想要將動態和可重用UI組件放入本身為動態且可重用的UI組件的各種情況很有用。例如,如果您使用ViewPager創建左右滑動片段并占用大部分屏幕空間的片段,則現在可以將片段插入到每個片段頁面中。
要嵌套片段,只需調用getChildFragmentManager()上Fragment要添加一個片段英寸 這將返回一個FragmentManager您可以像通常一樣從頂級活動中使用來創建片段事務的方法。例如,下面是一些在現有Fragment類中添加片段的代碼:
~~~
Fragment videoFragment = new VideoPlayerFragment();
FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
transaction.add(R.id.video_fragment, videoFragment).commit();
~~~
從嵌套的片段中,可以通過調用來獲取對父片段的引用 getParentFragment()。
Android支持庫現在也支持嵌套片段,因此您可以在Android 1.6或更高版本上實現嵌套片段設計。
注意:當布局包含a時,不能將布局膨脹成片段`<fragment>`。只有在動態添加到片段時才支持嵌套片段。
#### **的renderScript**
Renderscript計算功能已增強,具有以下功能:
**腳本內在函數**
您可以使用Renderscript的內置腳本內在函數為您實現常用操作,例如:
* Blends
* Blur
* Color matrix
* 3x3 convolve
* 5x5 convolve
* Per-channel lookup table
* Converting an Android YUV buffer to RGB
要使用內部腳本,請調用create()每個內部的靜態方法來創建腳本的一個實例。然后您調用set() 每個腳本固有的可用方法來設置任何必要的輸入和選項。最后,調用該forEach() 方法來執行腳本。
**腳本組**
ScriptGroups允許你鏈接相關的Renderscript腳本并用一個調用執行它們。
使用a ScriptGroup.Builder通過調用將所有腳本添加到組中addKernel()。一旦添加了所有腳本,就通過調用在腳本之間創建連接addConnection()。完成添加連接后,請致電create() 以創建腳本組。在執行腳本組之前,指定Allocation要使用該setInput(Script.KernelID, Allocation)方法運行的輸入 腳本和初始腳本, 并提供Allocation將結果寫入的輸出 以及運行的最終腳本setOutput()。最后,調用 execute()運行腳本組。
**Filterscript**
Filterscript定義了對現有Renderscript API的約束,使得生成的代碼可以在更廣泛的處理器(CPU,GPU和DSP)上運行。要創建Filterscript文件,創建.fs 文件而不是.rs文件,并指定#pragma rs_fp_relaxed告訴Renderscript運行時,腳本不需要嚴格的IEEE 754-2008浮點精度。這個精度允許將數據清零并將數據舍入到零。此外,您的Filterscript腳本不得使用32位內置類型,并且必須使用該__attribute__((kernel))屬性指定自定義的根函數, 因為Filterscript不支持root()函數的默認簽名定義的指針。
> 注意:盡管平臺中有Filterscript支持,但開發人員支持將在SDK Tools Release 21.0.1中提供。
有關Android 4.2中所有API更改的詳細視圖,請參閱 [API差異報告](https://developer.android.com/sdk/api_diff/17/changes.html)。
- 前言
- Google官網對Android API各版本的介紹
- jelly Bean(果凍豆)Android 4.1、4.2、4.3
- Android 4.1
- Android 4.2
- Android 4.3
- KitKat(Android 4.4.*)巧克力
- Android 4.4 APIS
- Lollipop(棒棒糖)Android 5.*
- Android 5.0 APIs
- Android 5.0 Changes(變更)
- Android 5.1APIs
- Marshmallow(棉花糖)Android 6.0
- Android 6.0 APIs
- Android 6.0 Changes(變更)
- Android 6.0 Samples
- Android 6.0 Testing
- Nougat(牛扎塘)Android 7.*
- Android 7.0
- API
- 行為變更
- 示例
- Android 7.1
- 開發者API
- 示例Sample
- Oreo(奧利奧)8.*
- Android 8.0
- 功能和 API
- Android 8.0 行為變更
- 向 Android 8.0 遷移應用
- Android 8.0 示例
- Android 8.1
- 后臺執行限制
- 后臺位置限制
- API指南
- Android 簡介
- 應用基礎知識
- 設備兼容性
- 系統權限
- 請求權限
- 定義權限
- 平臺架構
- Java8 概覽
- 在ART上驗證應用行為
- 應用組件
- Intent 和 Intent 過濾器(Google官網介紹)
- 通用intent
- Activity
- 任務和返回棧(官網譯文)
- 概覽屏幕
- 活動簡介
- 活動生命周期
- 活動狀態更改
- 進程和應用程序生命周期
- 包裹和捆綁
- 最近的屏幕
- 片段
- 加載器
- 服務Service
- 綁定服務
- AIDL
- 內容提供程序
- 內容提供程序基礎知識
- 創建內容提供程序
- 日歷提供程序
- 聯系人提供程序
- 存儲訪問框架
- 使用存儲訪問框架打開文件
- 創建自定義文檔提供程序
- 應用小部件
- 應用小部件主機
- 進程和線程
- 應用資源
- 概覽
- 提供資源
- 訪問資源
- 處理運行時變更
- 本地化
- ICU4J Android框架API
- Android上的國際化
- 語言和語言區域
- 復雜的XML資源
- 資源類型
- 動畫
- 顏色狀態列表
- 可繪制對象
- 布局
- 菜單
- 字符串
- 樣式
- 其他類型
- 應用清單
- <action>
- <activity>
- <activity-alias>
- <application>
- <category>
- <compatiable-screens>
- <data>
- <grant-uri-permission>
- <intent-filter>
- <manifest>
- <meta-data>
- <path-permission>
- <permission>
- <permission-group>
- <permission-tree>
- <provider>
- <receiver>
- <service>
- <supporte-gl-texture>
- <supports-screens>
- <uses-configuration>
- <uses-feature>
- <uses-library>
- <uses-permission>
- <uses-permission-sdk-23>
- <uses-sdk>
- 用戶界面
- 界面概覽
- 界面布局
- 線性布局
- 相對布局
- 列表視圖
- 網格視圖
- 回收站視圖
- 外觀和感覺
- 可下載的字體
- XML中的字體
- 表情符號兼容性
- 自動調整TextView
- 樣式和主題-
- 輸入控件
- 按鈕
- 文本字段
- 復選框
- 單選按鈕
- 切換按鈕
- 微調框
- 選取器
- 輸入事件
- 菜單Menu
- 設置
- 對話框
- 通知
- Toast
- 自適應圖標
- 應用快捷方式
- 搜索
- 創建搜索界面
- 添加近期查詢建議
- 添加自定義建議
- 可搜索配置
- 多窗口支持
- 拖放
- 無障礙功能
- 為應用設置無障礙功能
- 無障礙功能開發者檢查單
- 構建無障礙服務
- 讓應用更容易訪問
- 使用節點樹調試
- 構建可訪問自定義視圖
- 樣式和主題
- 自定義組件
- 動畫和圖形
- 概覽介紹
- 屬性動畫
- 視圖動畫
- 可繪制動畫
- 畫布和可繪制對象
- 基于物理的動畫
- Spring Animation
- Fling Animation
- OpenGL ES
- 硬件加速
- 計算
- RenderScript
- 高級RenderScript
- Runtime API Reference(參考)
- Numerical Types(數字類型)
- Object Types(對象類型)
- Conversion Functions(轉換函數)
- Mathematical Constants and Functions(數學常量和函數)
- Vector Math Functions(矢量數學函數)
- Matrix Functions(矩陣函數)
- Quaternion Functions(四元數函數)
- Atomic Update Functions(原子更新函數)
- Time Functions and Types(時間函數和類型)
- Allocation Data Access Functions(分配數據訪問函數)
- Object Characteristics Functions(對象特性函數)
- Kernel Invocation Functions and Types(內核調用函數和類型)
- Input/Output Functions(輸入輸出函數)
- Debugging Functions(調試函數)
- Graphics Functions and Types(圖形函數和類型)
- Index(索引)
- Media Apps(媒體應用)
- Media Apps Overview(媒體應用程序概述)
- Working with a Media Session(使用媒體會話)
- Building an Audio App(建立一個音頻應用)
- Building a Media Browser Service(構建媒體瀏覽器服務)
- Building a Media Browser Client(構建媒體瀏覽器客戶端)
- Media Session Callbacks(媒體會話回調)
- Building a Video App(建立一個視頻應用)
- Building a Video Player Activity(建立一個視頻播放器Activity)
- Media Session Callbacks-(媒體會話回調)
- Responding to Media Buttons(響應媒體按鈕)
- Handling Changes in Audio Output(處理音頻輸出的變化)
- Managing Audio Focus(管理音頻焦點)
- The Google Assistant and Media Apps(Google智能助理和媒體應用)
- 媒體和相機
- Supported Media Formats(支持的媒體格式)
- MediaPlayer(媒體播放器)
- MediaRecorder
- ExoPlayer
- Controller Amplitude with VolumeShaper(VolumeShaper控制器振幅)
- Media Routing(媒體路由)
- MediaRouter API
- MediaRouteProvider API
- Camera API(相機API)
- 位置和傳感器
- Location and Maps(位置和地圖)
- Location Strategies(位置策略)
- Sensors Overview(傳感器概覽)
- Motion Sensors(運動傳感器)
- Position Sensors(位置傳感器)
- Environment Sensors(環境傳感器)
- Raw GNSS Measurements(原始的GNSS測量)
- 連接
- Bluetooth
- Bluetooth Low Energy(藍牙低功耗)
- NFC
- NFC Basics(NFC基礎知識)
- Advanced NFC(高級NFC)
- Host-based Card Emulation(基于主機的卡模擬)
- Telecom(電信)
- Self-Managed ConnectionServices(自我管理的連接服務)
- Wi-Fi P2P
- Wi-Fi Aware
- Companion Device Pairing
- USB
- Accessory(配件)
- Host(主機)
- SIP
- 文本和輸入
- Autofill Framework(自動填充框架)
- Test your app with autofill(使用自動填充測試你的應用)
- Building autofill services(構建自動填充服務)
- Copy and Paste(復制和粘貼)
- Creating an IME(創建IME)
- Image Keyboard(圖像鍵盤)
- Spelling Checker(拼寫檢查程序)
- 數據存儲
- Storage Options(存儲選項)
- Data Backup(數據備份)
- Account Transfer API(賬戶轉移API)
- Auto Backup(自動備份)
- Key/Value Backup(鍵值備份)
- Testing Backup and Restore(測試備份和還原)
- App Install Location(應用安裝位置)
- 庫
- 支持庫
- 功能
- 修訂歷史記錄
- 庫設置
- 數據綁定庫
- 測試支持庫
- 管理
- 設備策略
- 網絡應用
- Supporting Different Screens in Web Apps(在網絡應用中支持不同屏幕)
- Building Web Apps in WebView(在WebView中構建網絡應用)
- Managing WebViews
- Migrating to WebView in Android 4.4(遷移到Android4.4中的WebView)
- Debugging Web Apps(調試網絡應用)
- Best Practices for Web Apps(網絡應用最佳做法)
- 最佳實踐
- Supporting Multiple Screens(支持多種屏幕)
- Distributing to Specific Screens(分配到特定屏幕)
- Screen Compatibility Mode(屏幕兼容性模式)
- Designing for Seamlessness
- Supporting Tablets and Handsets
- 培訓