Android4.2新特性及新增API

jopen 11年前發布 | 35K 次閱讀 Android Android開發 移動開發

Android 4.2 系統,名字仍為 Jelly Bean。以下是 Android 4.2 的新特性匯總。

 

無線視頻

Android 4.2 支持 Miracast 影像傳輸協議。據 The Verge 介紹,這是一種符合業界標準的 Wifi 顯示共享協議。這個功能可以讓 Nexus 4 等新設備將音頻、視頻無線傳輸到電視上去,你可以把它理解為“開放版本的 AirPlay”。

據悉,類似 Apple TV 的 Miracast 機頂盒將很快開售,Google 希望它們的售價保持在 99 美元以下。不僅如此,Miracast 將會很快直接內置到電視里,比如 LG 就已經承諾將其內置到 2013 年的智能電視里。 此外,Google 還透露開發者們可以在電視屏幕及手機屏幕上運行不同的程序。

 

Android 平板的多賬戶支持

Android 將支持多賬戶已經不是什么新鮮的傳言。在 Android 4.2 上,Google 終于正式發布了這個功能,不過只針對平板用戶。

每個賬戶可以擁有自己的主屏、壁紙、插件和應用,并且應用數據都可以區分開來。Android 4.2 在處理應用數據的時候非常聰明。假如賬戶 A 已經下載了某個應用,其他的賬戶無需再次下載,并且 Android 4.2 能確保其他用戶新裝的是一個“干凈”的版本。

切換賬戶的時候,原賬戶的應用將保持在后臺運行。不過,這種“后臺運行”的方式只能讓你完成下載等任務,其他任務幾乎處于關閉狀態。比如你不能在賬戶 A 的后臺運行著一個音樂播放器,然后在保持播放器運行的情況切換到賬戶 B。


Gesture Typing,滑動輸入

如果你對 Swype 輸入法有所耳聞,Android 4.2 的這個新功能你應該毫不陌生。

用戶可以通過手指在字母之間的滑行完成輸入操作,滑行過程中鍵盤上會顯示出單詞列表。這個新功能搭配上 Android 原有的單詞預測功能,The Verge 體驗的感覺是“相當不錯”,并稱這個功能的表現要比 Swype 更靈敏和準確。

Photo Sphere 全景相片

Android 4.0,Google 引進了全景拍照功能。iOS 6,蘋果緊隨其后。現在 Android 4.2 又把自家的全景拍照功能發展到了一個新的高度。

Android 4.2 新推出的“Photo Sphere 全景相片”功能可以讓用戶將四個方向的圖像全部拍攝下來,最終生成一張全景照片。據悉,這個功能使用了一些跟街景相關的技術

其他

Android 4.2 的其他新功能還有:

  • Daydream(白日夢)功能,可以將其理解為一個“屏保”。
  • 鎖屏界面現在也支持放置 Widgets,并且支持滑動開啟相機。
  • 通知抽屜(notification drawer)加入了更多的操作,可以打開 WiFi,調整屏幕亮度,打開飛行模式等等。
  • Gmail 支持縮放。
  • 輔助功能方面的改進:三擊放大屏幕,可以用兩指來平移和縮放,并為盲人用戶引進了語音輸出和手勢模式導航功能。
  • Gmail 現在也是 Google Now 的信息來源。Google Now 改進了航班追蹤、酒店和餐館預定、音樂及電影推薦的功能。Photo Spot 可以根據你的位置向你推薦拍照的好去處。
  • </ul>

     

     

    Android4.2新增API

    API等級:17

    Android4.2JELLY_BEAN_MR1)是一個為用戶和應用程序開發人員提供了新功能的JellyBean升級版本。本文檔為開發者提供了最顯著的和最有用的新API的簡介。

    作為應用程序開發人員,您應該盡快用SDK管理器下載Android4.2系統映像和SDK平臺的SDK管理器。如果您沒有Android4.2的設備用以測試您的應用,您可以在模擬器上使用Android4.2系統映像來測試您的應用。

    重要的行為變化

    如果您先前發表過Android應用,請注意下列變化,它們可能會影響您應用程序的行為:

    • Contentprovider默認不再有導出屬性。也就是說,android:exported屬性的默認值為"false"。如果別的應用能訪問您的contentprovider對您意義重大,您必須顯式的設置android:exported="true"
      此更改僅在您設置targetSdkVersionandroid:minSdkVersion17或更高時生效。否則,即使運行在Android4.2版本上時,默認值仍然是“true”

    • 相對以前的版本的Android,如果您的應用程序請求了ACCESS_COARSE_LOCATION權限而沒有請求ACCESS_FINE_LOCATION權限,用戶定位的精度會有所下降。
      為保護用戶隱私,當您的應用僅請求了大概位置權限(而沒有請求準確位置權限)時,系統提供的位置精度將小于一個街區。

    • 一些Settings.System中所定義的設備設置變為了只讀。一些原先在Settings.System中現在移到了Settings.Global中。在Android4.2或更高系統上,如果您的應用試圖修改這些設置,操作將不起作用。
      即便您的android:targetSdkVersionandroid:minSdkVersion低于17,您的應用也無法在Android4.2上修改已經移至Settings.Global中的設置項。

    白日夢

    白日夢是Android設備的新型互動屏保模式。當設備置入底座或充電閑置狀態時(屏幕沒有關閉),此模式自動激活。白日夢模式每次顯示一個,可以是純粹的視覺效果,在用戶觸摸時消失,也可以是響應用戶所有輸入的交互式應用。您的白日夢將運行在您應用的進程內,并可以訪問所有的AndroidUI工具包,可以使用視圖、布局和動畫等。所以它比動態壁紙或應用窗口小部件更具表現力。

    您可以由實現DreamService的子類來創建一個白日夢。DreamServiceAPI被設計成類似Activity。在通過諸如onAttachedToWindows()之類的方法獲得窗口后,就可以給setContentView()設定一個布局資源IDView,來為您的白日夢設置UI

    DreamService類在基礎的ServiceAPI上添加了很多其它重要的生命周期回調方法。如onDreamingStarted()、onDreamingStopped()和onDetachedFromWindow()。您無法從您的應用中啟動DreamService,它是由系統自動啟動的。

    如果您設計的是互動型的白日夢,您可以由白日夢將用戶導入到您應用中的Activity中,以獲得更詳盡的內容和更多控制方法。您可以使用finish()來結束白日夢,之后用戶就可以看到新的Activity

    為了使您的白日夢對系統可用,您需要在manifest文件中的元素下聲明您的DreamService。然后,您必須在其中加入具有"android.service.dreams.DreamService"動作的intentfilter。例如:

            <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()來隱藏狀態欄。

    白日夢開始之前,顯示屏會漸暗以提示用戶空閑超時時間接近。調用setScreenBright(true)則會去除這個過程。

    欲了解更多信息,,請參閱DreamService文檔。

    輔助顯示器

    Android現在可以讓您的應用在輔助顯示器上顯示不同的內容程序,以有線或Wi-Fi將外接顯示輸出連接到用戶設備上,顯示獨特的內容。要為輔助顯示屏創建獨特的內容,您需要擴展Presentation類,并實現onCreate()回調方法。在onCreate()中,調用setContentView()來指定您要在輔助顯示屏上顯示的UI。作為Dialog類的擴展,Presentation類提供了一個區域,在其中,您的應用可以在輔助顯示屏上顯示不同的UI

    為了獲取顯示Presentation的輔助顯示屏,您可以使用DisplayManager或者MediaRouterAPI。其中,使用DisplayManagerAPI可以使您獲得當前連接的所有顯示屏的枚舉,而MediaRouter則可以使您直接訪問系統為Presentation設置的默認顯示輸出。

    您可以給MediaRouter.getSelectedRoute()傳一個ROUTE_TYPE_LIVE_VIDEO來獲得演示的默認顯示器。它將返回一個MediaRouter.RouteInfo對象,描述了系統為視頻演示所選擇的當前路由。如果MediaRouter.RouteInfo不空,調用getPresentationDisplay()即可獲取當前連接的顯示屏對象:Display

    然后,您可以將這個Display對象傳入Presentation的構造函數。演示就會出現在輔助顯示屏上了。

    為在運行時即時檢測新接入的顯示器,需要先創建一個MediaRouter.SimpleCallback的實例。在其中,您需要實現onRoutePresentationDisplayChanged()回調方法。當新的顯示器連接時,系統會調用這個回調方法。然后將MediaRouter.SimpleCallback加上ROUTE_TYPE_LIVE_VIDEO路由類型傳遞給MediaRoute.addCallback()來進行注冊。當收到onRoutePresentationDisplayChanged()回調時,只要如上所述的調用MediaRouter.getSelectedRoute()即可。

    為針對輔助顯示進一步優化PresentationUI,您需要為您的應用或activity指定標簽為android:presentationTheme主題。

    請留意,連接到用戶移動設備的屏幕往往有較大的屏幕尺寸和不同的屏幕密度。由于屏幕特征可能不同,您需要為大型顯示設備提供特定優化的資源。如果您需要從Presentation中獲取額外的資源,調用getContext().getResources()來獲取針對這種顯示的資源對象。這樣,您的應用就可以根據輔助顯示器的尺寸和密度提供最合適的資源了。

    欲了解更多信息以及一些代碼示例,請參閱Presentation類文檔。

    鎖屏小部件

    Android現在允許用戶添加應用窗口小部件至鎖屏界面。為了使您應用程序的窗口小部件可用于在鎖屏,您需要在指定了AppWidgetProviderInfoXML文件中加入android:widgetCategory屬性。此屬性支持兩個取值:home_screenkeyguard。默認情況下,屬性設置為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來對每個用戶進行甄別。或者,您也可以保存從您的服務器獲取的本地令牌或由谷歌云消息服務所提供的注冊ID來進行甄別。

    要注意的是,如果您的應用使用硬件設備標識符(如WiFiMAC地址,序列號,或ANDROID_ID數),它們會為每個用戶提供相同的值,因為這些標識符依賴的硬件,而不是用戶。更不用說使用這些標識符還會引起各種各樣的其它問題。

    新的“全局設置”

    系統設置已經為支持多用戶作了更新,添加了Settings.Global類。這一系列設置與Settings.Secure設置類似,也是只讀的,但對于設備上的所有用戶空間生效。

    很多原來位于Settings.SystemSettings.Secure的設置移到了這里。如果您應用對曾經在Settings.System中定義的設置(比如AIRPLANE_MODE_ON)進行過更改的話,那么您就應該想到,在Android4.2和更高版本的設備上,這些設置已經移至Settings.Global,從而您的代碼不會再起作用了。您仍然可以由Settings.Global中讀取設置,但在Android4.2和更高的版本中,因為覺得這些設置不應當被應用修改,所以所有的修改操作將不被執行,并在系統日志中記下一條警告記錄。

    RTL布局支持

    Android現在提供了一些API,使您可以構建更優雅的變換布局方向的用戶界面。這些界面將支持由右到左(RTL)的語言和閱讀方向。比如阿拉伯語和希伯來語。

    為了使您的應用支持RTL布局,需要在manifest文件中設置元素的android:supportsRtl屬性為“true”。一旦啟用,該系統將啟用各種RTLAPI來用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. 或者,使用ldrtl資源限定詞(ldrtl意味著布局方向由右至左)資源提供完整的針對RTL布局優化過的布局文件。例如,您可以在res/layout/目錄保存您默認的配置文件,而在res/layout-ldrtl/目錄下保存您針對RTL優化過的布局。
      ldrtl
      限定詞對drawable資源也很適用,這樣您就可以提供與閱讀方向相同的圖片了。

    框架中還有各種其它的支持RTL布局的API,比如,在View類中,您可以在定制的view中實現適當的行為;在Configuration類中,可以查詢當前的布局方向。

    注意:如果您用SQLite而表名或列名使用了“僅允許數字”特性。請小心:當您的設備設置為阿拉伯地區,使用String.format(String,Object...) 方法時會因為數字轉換成對應的阿拉伯文而導致錯誤。您必須使用String.format(Locale,String,Object...),以確保數字以ASCII的編碼保存。還可以使用String.format("%d",int)來取代String.valueOf(int)以格式化數字。

    嵌套Fragment

    現在,您可以嵌套FragementFragment中。當您遇到想在一個可復用的動態UI組件里放入另一個可復用的UI組件時,這個方案就非常有用。例如,如果您用ViewPager做了個可左右滑動的Fragment,并占用了大部分屏幕空間,您可以在其中的每個fragment頁面中嵌入別的fragment了。

    想要實現嵌套Fragment,只需在您想進行嵌入的Fragment中調用getChildFragmentManager() 方法。這樣會返回一個FragmentManager,然后您就可以用和在頂層的Acitivity中嵌入fragment一樣的方法進行操作了。例如,以下代碼在一個現有的Fragment類中加上了另一個Fragment

    Fragment videoFragment = new VideoPlayerFragment();
    FragmentTransaction transaction = getChildFragmentManager().beginTransaction();
    transaction.add(R.id.video_fragment, videoFragment).commit();

    在嵌套的fragment中,您可以通過調用getParentFragment()方法來獲取父fragment的引用。

    Android支持庫現在也加入了嵌套Fragment支持,因此在Android1.6及更高版本上,您都可以使用嵌套fragment來進行設計。

    注意:不能在fragment中導入一個包含標簽的布局文件。嵌套fragment僅支持動態加入fragment

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