共用方式為


果凍豆功能

本檔將為 Android 4.1 中引進的開發人員提供新功能的高階概觀。 這些功能包括:增強通知、Android Beam 更新以共用大型檔案、多媒體更新、點對點網路探索、動畫、新許可權。

概觀

Android 4.1 (API 層級 16),也稱為“果凍豆”,於 2012 年 7 月 9 日發行。 本文將針對使用 Xamarin.Android 的開發人員,提供 Android 4.1 中某些新功能的高階簡介。 其中一些引進的新功能是動畫的增強功能,可用於啟動活動、相機的新音效,以及改善對應用程式堆棧瀏覽的支援。 現在可以使用意圖剪下並貼上。

Android 應用程式的穩定性已改善,能夠隔離對不穩定內容提供者的相依性。 服務也可以隔離,以便只有啟動服務的活動才能存取它們。

已針對使用 Bonjour、UPnP 或多播 DNS 型服務的網路服務探索新增支援。 現在,更豐富的通知可以格式化文字、動作按鈕和大型影像。

最後,Android 4.1 已新增數個新許可權。

需求

若要使用 Jelly Bean 開發 Xamarin.Android 應用程式,需要透過 Android SDK 管理員安裝 Xamarin.Android 4.2.6 或更高版本和 Android 4.1(API 層級 16),如下列螢幕快照所示:

在 Android SDK 管理員中選取 Android 4.1

新功能

動畫

活動可以使用縮放動畫或使用 類別來啟動自定義動畫 ActivityOptions 。 提供下列新方法來支援這些動畫:

  • MakeScaleUpAnimation – 這會建立動畫,從畫面上的開始位置和大小相應增加活動視窗。
  • MakeThumbnailScaleUpAnimation – 這會建立動畫,從畫面上指定位置的縮圖影像相應增加。
  • MakeCustomAnimation – 這會從應用程式中的資源建立動畫。 活動開啟時有一個動畫,另一個動畫則用於活動停止時。

新的 TimeAnimator 類別提供一個介面 TimeAnimator.ITimeListener ,可在每次動畫中的畫面變更時通知應用程式。 例如,請考慮下列 的實作 TimeAnimator.ITimeListener

class MyTimeListener : Java.Lang.Object,  TimeAnimator.ITimeListener
{
    public void OnTimeUpdate(TimeAnimator animation, long totalTime, long deltaTime)
    {
        Log.Debug("Activity1", "totalTime={0}, deltaTime={1}", totalTime, deltaTime);
    }
}

現在若要使用 類別,會建立的 TimeAnimator 實例,並設定接聽程式:

var animator = new TimeAnimator();
animator.SetTimeListener(new MyTimeListener());
animator.Start();

當實例正在執行時 TimeAnimator ,它會叫 ITimeAnimator.ITimeListener用 ,然後記錄動畫師執行的時間長度,以及自上次叫用方法之後的時間長度。

應用程式堆疊流覽

Android 4.1 可改善 Android 3.0 中引進的應用程式堆疊流覽。 藉由指定 ParentNameActivityAttribute屬性,當使用者按下 動作列上的 [向上] 按鈕 時,Android 可以開啟適當的父活動 - Android 會具現化 屬性所 ParentName 指定的 Activity。 這可讓應用程式保留產生指定工作的活動階層。

對於大部分的應用程式而言,在活動上設定 ParentName 是 Android 足夠的資訊,以提供正確的行為來巡覽應用程式堆疊;Android 會針對每個父活動建立一系列意圖,以合成必要的後端堆疊。 不過,由於這是人工應用程式堆疊,因此每個綜合活動都不會有自然活動會擁有的已儲存狀態。 若要將儲存狀態提供給綜合父活動,Activity 可能會覆寫 OnPrepareNavigationUpTaskStack 方法。 這個方法會 TaskStackBuilder 接收實例,其中包含 Android 將用來建立後台堆疊的 Intent 物件集合。 活動可能會修改這些意圖,如此一來,當綜合活動建立時,它會收到適當的狀態資訊。

針對更複雜的案例,Activity 類別上有一些新方法可用來處理向上瀏覽的行為,並建構返回堆疊:

  • OnNavigateUp– 藉由覆寫此方法,可以在按下 [上一步] 按鈕時執行自定義動作。
  • NavigateUpTo – 呼叫此方法會導致應用程式從目前活動巡覽至指定意圖所指定的活動。
  • ParentActivityIntent – 這是用來取得意圖,以啟動目前活動的父活動。
  • ShouldUpRecreateTask – 這個方法可用來查詢是否必須建立綜合備份堆疊,以巡覽至父活動。 如果必須建立綜合堆疊,則傳 true 回 。
  • FinishAffinity – 呼叫這個方法將會完成目前活動,以及目前工作中具有相同工作親和性的所有活動。
  • OnCreateNavigateUpTaskStack – 當必須完全控制合成堆疊的建立方式時,就會覆寫這個方法。

相機

有一個新的介面, Camera.IAutoFocusMoveCallback可用來偵測自動焦點何時啟動或停止移動。 您可以在下列代碼段中看到這個新介面的範例:

public class AutoFocusCallbackActivity : Activity, Camera.IAutoFocusCallback
{
    public void OnAutoFocus(bool success, Camera camera)
    {
        // camera is an instance of the camera service object.

        if (success)
        {
            // Auto focus was successful - do something here.
        }
        else
        {
            // Auto focus didn't happen for some reason - react to that here.
        }
    }
}

新的類別 MediaActionSound 提供一組 API,用於為各種媒體動作產生音效。 相機可能會發生數個動作,這些動作是由列舉 Android.Media.MediaActionSoundType所定義:

  • MediaActionSoundType.FocusComplete – 當焦點完成時所播放的這個聲音。
  • MediaActionSoundType.ShutterClick – 拍攝靜止影像圖片時,將會播放這個聲音。
  • MediaActionSoundType.StartVideoRecording – 這個聲音是用來指出視訊錄製的開始。
  • MediaActionSoundType.StopVideoRecording – 此音效將會播放,以指出視訊錄製的結尾。

下列代碼段中可以看到如何使用 MediaActionSound 類別的範例:

var mediaActionPlayer = new MediaActionSound();

// Preload the sound for a shutter click.
mediaActionPlayer.Load(MediaActionSoundType.ShutterClick);
var button = FindViewById<Button>(Resource.Id.MyButton);

// Play the sound on a button click.
button.Click += (sender, args) => mediaActionPlayer.Play(MediaActionSoundType.ShutterClick);

// This releases the preloaded resources. Don’t make any calls on
// mediaActionPlayer after this.
mediaActionPlayer.Release();

連線性

Android Beam

Android Beam 是以 NFC 為基礎的技術,可讓兩部 Android 裝置彼此通訊。 Android 4.1 可提供更好的大型檔案傳輸支援。 使用新的方法NfcAdapter.SetBeamPushUris()時,Android 會切換替代傳輸機制(例如 藍牙),以達到快速傳送速率。

網路服務探索

Android 4.1 包含適用於多播 DNS 服務探索的新 API。 這可讓應用程式透過Wi-Fi偵測並連線到其他裝置,例如印表機、相機和媒體裝置。 這些新的 API 位於套件中 Android.Net.Nsd

若要建立其他服務可能取用的服務,類別 NsdServiceInfo 會用來建立對象來定義服務的屬性。 接著,這個物件會連同 的實作NsdManager.ResolveListenerNsdManager.RegisterService()起提供給 。 的 NsdManager.ResolveListener 實作可用來通知成功的註冊,以及取消註冊服務。

若要探索網路上的服務,以及傳遞至NsdManager.discoverServices()的實作Nsd.DiscoveryListener

網路使用量

新的方法可 ConnectivityManager.IsActiveNetworkMetered 讓裝置檢查其是否已連線到計量付費網路。 這個方法可用來協助管理數據使用量,方法是準確地通知用戶數據作業可能會產生昂貴的費用。

WiFi Direct 服務探索

類別 WifiP2pManager 是在 Android 4.0 中引進,以支援 zeroconf。 Zeroconf (零組態網路)是一組技術,可讓裝置(計算機、印表機、手機)自動連線到網路,並搭配人類網路操作員或特殊設定伺服器的介入。

在 Jelly Bean 中,WifiP2pManager可以使用 BonjourUpnp 探索附近的裝置。 Bonjour 是蘋果對 zeroconf 的實作。 Upnp 是一組也支援 zeroconf 的網路通訊協定。 新增至 WiFiP2pManager 以支援Wi-Fi服務探索的下列方法:

  • AddLocalService() – 此方法會透過Wi-Fi宣告應用程式即服務,以供對等探索。
  • AddServiceRequest( ) – 此方法是將服務探索要求傳送至架構。 它用來初始化Wi-Fi服務探索。
  • SetDnsSdResponseListeners() – 這個方法可用來註冊回呼,以在接收來自 Bonjour 的探索要求回應時叫用。
  • SetUpnpServiceResponseListener() – 這個方法可用來註冊回呼,以在接收對探索要求 Upnp 的回應時叫用。

內容提供者

類別 ContentResolver 已收到新的方法 AcquireUnstableContentProvider。 此方法可讓應用程式取得「不穩定」的內容提供者。 一般而言,當應用程式取得內容提供者,且該內容提供者當機時,應用程式也會當機。 使用此方法呼叫時,如果內容提供者當機,應用程式將不會當機。 相反地, Android.OS.DeadObjectionException 將會從內容提供者的呼叫擲回,以通知應用程式內容提供者已消失。 與來自其他應用程式的內容提供者互動時,「不穩定」內容提供者很有用;另一個應用程式的 Buggy 程式代碼對另一個應用程式的影響不太可能。

使用意圖複製和貼上

類別Intent現在可以透過 Intent.ClipData 屬性建立ClipData與其相關聯的物件。 這個方法可讓剪貼簿中的額外數據以意圖傳輸。 的 ClipData 實體可以包含一或多個 ClipData.ItemClipData.Item是下列類型的專案:

  • Text – 這是任何文字字串,無論是 HTML 或內建 Android 樣式範圍支援其格式的任何字串。
  • 意圖 – 任何 Intent 物件。
  • Uri – 這可以是任何 URI,例如 HTTP 書籤或內容提供者的 URI。

隔離的服務

隔離服務是在其專屬特殊進程中執行且沒有本身許可權的服務。 唯一與服務的通訊是在啟動服務並透過服務 API 系結至服務時。 藉由在 裝飾服務類別的 中ServiceAttribute設定 屬性IsolatedProcess="true",可以將服務宣告為隔離。

媒體

新的 Android.Media.MediaCodec 類別會提供 API 給低階媒體編解碼器。 應用程式可以查詢系統,以找出裝置上可用的低階編解碼器。

已新增新的 Android.Media.Audiofx.AudioEffect 子類別,以支援所擷取音訊的其他音訊前置處理:

  • Android.Media.Audiofx.AcousticEchoCanceler – 這個類別用於前置處理音訊,以從擷取的音訊號中移除遠端合作對象的訊號。 例如,從語音通訊應用程式移除回應。
  • Android.Media.Audiofx.AutomaticGainControl – 這個類別是用來藉由提升或降低輸入訊號來正規化擷取的訊號,以便輸出訊號是常數。
  • Android.Media.Audiofx.NoiseSuppressor – 這個類別會從擷取的訊號中移除背景雜訊。

並非所有裝置都支持這些效果。 應用程式應該呼叫 方法 AudioEffect.IsAvailable ,以查看執行應用程式的裝置是否支援有問題的音訊效果。

類別 MediaPlayer 現在支援使用 SetNextMediaPlayer() 方法的無間距播放。 這個新方法會指定要在目前媒體播放機完成播放時啟動的下一個 MediaPlayer。

下列新類別提供標準機制和UI,以選取媒體的播放位置:

  • MediaRouter – 這個類別可讓應用程式控制從裝置到外部喇叭或其他裝置的媒體信道路由。
  • MediaRouterActionProviderMediaRouteButton – 這些類別有助於提供一致的 UI 來選取和播放媒體。

通知

Android 4.1 可讓應用程式更有彈性和控制顯示通知。 應用程式現在可以向用戶顯示更大且更好的通知。 新的方法, NotificationBuilder.SetStyle() 允許在通知上設定三個新的樣式之一:

  • Notification.BigPictureStyle – 這是協助程序類別,其會產生將有影像的通知。 下圖顯示具有大型影像的通知範例:

BigPictureStyle 通知的範例螢幕快照

  • Notification.BigTextStyle – 這是協助程序類別,其會產生將包含多行文字的通知,例如電子郵件。 您可以在下列螢幕快照中看到這個新通知樣式的範例:

BigTextStyle 通知的範例螢幕快照

  • Notification.InboxStyle – 這是協助程式類別,會產生包含字串清單的通知,例如電子郵件訊息的代碼段,如此螢幕快照所示:

Notification.InboxStyle 通知的範例螢幕快照

當通知使用一般或較大的樣式時,最多可以在通知訊息底部新增兩個動作按鈕。 您可以在下列螢幕快照中看到此範例,其中動作按鈕會顯示在通知底部:

通知訊息下方顯示的動作按鈕範例螢幕快照

類別 Notification 已收到新的常數,可讓開發人員指定通知五個優先順序層級的其中一個。 這些可以使用 屬性在通知 Priority 上設定。

權限

已新增下列新許可權:

  • READ_EXTERNAL_STORAGE - 應用程式需要外部記憶體的唯讀存取權。 目前所有應用程式預設都有讀取許可權,但未來的 Android 版本會要求應用程式明確要求讀取許可權。
  • READ_USER_DICTIONARY - 允許使用者文字字典的讀取許可權。
  • READ_CALL_LOG - 允許應用程式讀取通話記錄檔,以取得連入和傳出通話的相關信息。
  • WRITE_CALL_LOG - 允許應用程式在手機上寫入通話記錄檔。
  • WRITE_USER_DICTIONARY - 允許應用程式寫入使用者的文字字典。

要注意 READ_EXTERNAL_STORAGE 的重要變更 – 目前 Android 會自動授與此許可權。 未來的 Android 版本會要求應用程式在授與許可權之前要求此許可權。

摘要

本文介紹 Android 4.1 中提供的一些新 API(API 層級 16)。 它醒目提示動畫的一些變更,並動畫啟動活動,並引進了使用 Bonjour 或 UPnP 等通訊協定來探索其他裝置的新 API。 API 的其他變更也會反白顯示,例如能夠透過意圖剪下和貼上數據、使用隔離服務或「不穩定」的內容提供者。

本文接著會介紹通知的更新,並討論Android 4.1引進的一些新許可權