Android中經(jīng)過強化且準備對接可穿戴設備的通知機制
譯文【51CTO譯文】通知機制是一種非常實用的應用程序用戶交互方式,而在Android Wear設備的支持下,我們現(xiàn)在已經(jīng)能夠利用可穿戴設備運行Android系統(tǒng)并由此拓展出更為廣闊的適用范疇。有鑒于此,學習充分利用此類設備的功能特性就變得***價值,大家可以借此添加適當?shù)幕顒油ㄖ蛘邉?chuàng)建只顯示在可穿戴設備之上的通知信息。
在今天的文章中,我們將共同探討現(xiàn)代通知機制的實現(xiàn)方式,正如谷歌公司在今年的I/O大會上所展示。我們將利用新的支持軟件包并以其功能為基礎添加只能顯示在智能手表上的活動信息——事實上,智能手表正是目前惟一正式面世了的Android Wear可穿戴設備。
1. 準備工作
要完成今天的項目,大家可以使用Android Studio或者Android開發(fā)者工具。如果各位一直在使用Android Studio,那么需要確保將以下命令行添加到build.gradle文件當中。
1 |
compile "com.android.support:support-v4:20.0.+" |
2. 建立新項目
后來,大家首先啟動自己的IDE并創(chuàng)建一個新的Android項目,當然直接打開原先創(chuàng)建好的項目也是可行的。在今天的文章中,我們將創(chuàng)建一個新項目,并將其命名為ImprovedNotifications。另外,也別忘記為它選擇***的包名稱。
在創(chuàng)建項目的過程中,大家請確保在Create Activity步驟中選擇的是Empty Activity選項。
當項目創(chuàng)建完成后,再創(chuàng)建一個新的Activity,也就是ActivatedActivity。該Activity將在后續(xù)運行中被來自手機或者可穿戴設備的通知機制所調用。
在我們繼續(xù)下一步之前,需要將以下代碼添加到strings.xml文件中,文章后面需要對其加以使用。
- <?xml version="1.0" encoding="utf-8"?>
- <resources>
- <string name="app_name">ImprovedNotifications</string>
- <string name="title_activity_activated">ActivatedActivity</string>
- <string name="message">Hi"!" I"'"m the activated activity</string>
- <string name="button_text">Try me for a new notification</string>
- <string name="notification_title">Hey Mom"!" I"'""m a title</string>
- <string name="notification_text">Look at me"!" I"'"m a sexy notification content</string>
- <string name="first_action">Let"'"s see the author"'"s twitter profile</string>
- <string name="wearable_action">I only appear here</string>
- </resources>
3. 創(chuàng)建布局
完成上述工作后,現(xiàn)在要做的是為MainActivity以及ActivatedActivity類創(chuàng)建一套布局。其中MainActivity類的布局如以下代碼所示:
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="${relativePackage}.${activityClass}" >
- <Button
- android:id="@+id/notification_button"
- android:layout_height="wrap_content"
- android:layout_width="wrap_content"
- android:layout_centerInParent="true"
- android:padding="10dp"
- android:text="@string/button_text"/>
- </RelativeLayout>
以下代碼則為ActivatedActivity類的布局。
- <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
- xmlns:tools="http://schemas.android.com/tools"
- android:layout_width="match_parent"
- android:layout_height="match_parent"
- tools:context="${relativePackage}.${activityClass}" >
- <TextView
- android:layout_width="wrap_content"
- android:layout_height="wrap_content"
- android:padding="10dp"
- android:layout_centerInParent="true"
- android:text="@string/message"/>
- </RelativeLayout>
#p#
4. 創(chuàng)建一套通知機制
我們需要在MainActivity類當中創(chuàng)建一套通知機制。在以下代碼片段中,大家可以看到要采取哪些步驟才能生成一條通知。我已經(jīng)在代碼當中加入注釋,旨在幫助大家了解各個步驟的具體含義。不過別擔心,稍后我們會再次分步對其實現(xiàn)流程加以解讀。
- package com.androiheroes.improvednotifications;
- import android.app.Activity;
- import android.app.Notification;
- import android.app.PendingIntent;
- import android.content.Intent;
- import android.net.Uri;
- import android.os.Bundle;
- import android.support.v4.app.NotificationCompat;
- import android.support.v4.app.NotificationManagerCompat;
- import android.view.View;
- import android.widget.Button;
- public class MainActivity extends Activity {
- /* 我們將要使用的功能部件 */
- private Button button;
- /*
- * 這里是通知信息ID
- *大家可以利用它忽略在通知管理器上調用cancel()方法的通知信息。
- */
- private int notification_id = 1;
- private final String NOTIFICATION_ID = "notification_id";
- /* 這些是我們用于啟動通知機制的類。 */
- private NotificationCompat.Builder notification_builder;
- private NotificationManagerCompat notification_manager;
- @Override
- protected void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- setContentView(R.layout.activity_main);
- /*
- * Step 1
- * Instantiation of the button you use to start the notification
- */
- button = (Button) findViewById(R.id.notification_button);
- /*
- * 第二步
- *創(chuàng)建intent后,我們就可以保證用戶在點觸通知欄后將其啟動,
- *并由PendingIntent對其加以處理。
- */
- Intent open_activity_intent = new Intent(this, ActivatedActivity.class);
- open_activity_intent.putExtra(NOTIFICATION_ID, notification_id);
- PendingIntent pending_intent = PendingIntent.getActivity(this, 0, open_activity_intent, PendingIntent.FLAG_CANCEL_CURRENT);
- /*
- * 第三步
- *在這里,我們創(chuàng)建通知機制并向其中添加實際運行中需要使用的全部屬性。
- */
- notification_builder = new NotificationCompat.Builder(this)
- .setSmallIcon(R.drawable.ic_launcher)
- .setContentTitle(getString(R.string.notification_title))
- .setContentText(getString(R.string.notification_text))
- /*
- *這一方法要求我們的通知機制必須具備通知信息的全部默認特征,
- * 例如聲音與振動提示。
- */
- .setDefaults(Notification.DEFAULT_ALL)
- /*這一方法將在用戶點觸通知欄后將其忽略。 */
- .setAutoCancel(true)
- .setContentIntent(pending_intent);
- /*
- * 第四步
- *在這里,我們對通知管理器對象進行實例化,從而開始/停止通知機制。
- */
- notification_manager = NotificationManagerCompat.from(this);
- }
- @Override
- protected void onStart() {
- super.onStart();
- /*
- * 第五步
- * 當我們點觸屏幕上的按鈕時,通知內容就會顯示出來。
- */
- button.setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(View v) {
- notification_manager.notify(notification_id, notification_builder.build());
- }
- });
- }
- }
***步
我們首先對用于啟動通知機制的按鈕進行實例化。大家也可以直接在onCreate方法中創(chuàng)建通知,但使用按鈕方式能夠讓我們更為確切地對通知時間加以控制。
第二步
在第二步中,我們需要在通知欄被點觸后對Intent對象進行實例化并執(zhí)行對應任務。我們將該對象傳遞至PendingIntent實例,并在后續(xù)調用時再進行處理。
第三步
利用Android支持庫,我們使用NotificationCompat對象中的Builder類創(chuàng)建通知,而后為其設定屬性。
第四步
在這一步中,我們對NotificationManagerCompat實例進行實例化,從而在任意必要時間點開始并/或停止通知機制。這樣一來,大家就能更輕松地對自己的成果進行測試。
第五步
當該按鈕被點觸時,通知會利用notify方法加以啟動。
當然,不要忘記使用由Android支持庫提供的各種類。通過這種方式,大家能夠確保自己的通知機制在舊有Android版本上同樣擁有與其風格相符的顯示效果。
現(xiàn)在大家可以運行這款應用,點觸按鈕并在屏幕上方查看到通知內容了。如果大家點擊通知部分,則會切換至ActivatedActivity activity當中。既然通知機制已經(jīng)創(chuàng)建完成并開始正常運轉,接下來要做的就是向其中添加活動信息了。
5.向通知中添加活動
大家可以通過在notification_builder對象上調用addAction方法來向通知中添加額外活動。為了使其確切起效,我們需要向其傳遞一個PendingIntent實例,其中包含有即將執(zhí)行的對應任務。
在以下代碼片段中,我向大家展示了如何分步創(chuàng)建出一項包含有定制任務的活動。在該示例當中,我將采用自己在Twitter應用中的Twitter配置文件。也就是說,我需要利用一個URI實例指向自己的Twitter配置文件,將其添加到Intent當中,而后在活動被點觸時由PendingIntent對其進行處理。將以下代碼添加到notification_builder對象的實例化部分之前。
- /*移動通知機制中的活動必須執(zhí)行某項任務。
- *在這里的示例中,用戶點觸后該作者的Twitter配置文件會在Twitter應用中被打開。
- *但大家也可以根據(jù)實際需要在自己的配置文件中對操作方式加以修改。
- */
- Intent open_twitter_profile = new Intent(Intent.ACTION_VIEW);
- Uri twitter_profile_location = Uri.parse("twitter://user?screen_name=@kerpie");
- open_twitter_profile.setData(twitter_profile_location);
- PendingIntent twitter_intent = PendingIntent.getActivity(this, 0, open_twitter_profile, 0);
為了添加該活動,我們需要在notification_builder對象上調用addAction方法并將其傳遞至我們剛剛創(chuàng)建完成的open_twitter_profile對象當中。
- /*
- *大家在這里創(chuàng)建自己的通知機制,
- *并將所有需要使用的屬性添加進來。
- */
- notification_builder = new NotificationCompat.Builder(this)
- .setSmallIcon(R.drawable.ic_launcher)
- .setContentTitle(getString(R.string.notification_title))
- .setContentText(getString(R.string.notification_text))
- /*
- *這一方法要求我們的通知包含所有必要的默認通知特征,
- * 例如聲音與振作提示機制。
- */
- .setDefaults(Notification.DEFAULT_ALL)
- /*這一方法將在被點觸時忽略當前通知信息。 */
- .setAutoCancel(true)
- .setContentIntent(pending_intent)
- /*
- *大家可以在這里向自己的移動設備添加活動,
- *需要注意我們所添加的活動數(shù)量。
- *在本示例以及大多數(shù)情況下,活動數(shù)量越少越好。
- */
- .addAction(android.R.drawable.ic_dialog_info, getString(R.string.first_action), twitter_intent);
運行該應用程序,點觸按鈕以觸發(fā)通知機制,這時大家應該會看到通知內容會與我們剛剛創(chuàng)建的活動一同顯示出來。
盡管我們完全可以利用addAction方法向同一條通知中添加更多活動,但必須確保用戶不會因為活動數(shù)量太多而感到無所適從。
#p#
6. Android Wear實際支持效果
講到這里,我們已經(jīng)利用來自Android支持庫的各種類保證了通知內容能夠切實顯示在運行Android Wear系統(tǒng)的智能手表之上。大家可以在智能手表真機上運行該應用,也可以嘗試在Android虛擬設備管理器中提供的模擬器內感受其實際效果。無論采取哪種方式,我們都需要將自己的移動設備與智能手表進行同步。
在將移動設備與智能手表模擬器進行同步之前,大家首先需要安裝Android Wear應用程序,現(xiàn)在各位已經(jīng)能從Google Play上下載到這款應用。在將所有其它與計算機相連接的Android設備拔下之后,在命令行中執(zhí)行以下命令。
- adb devices
這條命令顯示出當前已經(jīng)連入開發(fā)計算機的所有設備。大家應該能夠從中看到兩條項目,分別為智能手表模擬器與自己的移動設備。接下來在命令行中運行以下命令以啟用端口轉發(fā)功能。
- adb -d forward tcp:5601 tcp:5601
現(xiàn)在大家可以將移動設備與智能手表模擬器相連,并利用Android Wear應用程序啟動通知機制了。再次運行該應用程序,然后觸發(fā)通知。通知內容的顯示效果應該如下圖所示。
7. 添加只能顯示在可穿戴設備上的活動
我們也可以添加一些只會顯示在可穿戴設備上的活動內容。要實現(xiàn)這一目標,我們需要調用WearableExtender類中的addAction方法。這樣處理的結果是,任何被添加到NotificationCompat.Builder類中的活動都會被直接忽略。
與之前的實現(xiàn)方式一樣,要觸發(fā)該活動,我們需要利用Intent與PendingIntent實例。但除此之外,我們還需要利用特殊Action類中的Builder類創(chuàng)建出顯示在可穿戴設備上的活動——如下所示,這一Builder類為NotificationCompat類的組成部分。
- /*在這里,我們要對智能手表中的活動被點觸時所需要使用的Intent進行實例化。 */
- Intent wearable_intent = new Intent(this, ActivatedActivity.class);
- PendingIntent wearable_pending_intent = PendingIntent.getActivity(this, 0, wearable_intent, PendingIntent.FLAG_UPDATE_CURRENT);
- /*現(xiàn)在我們已經(jīng)創(chuàng)建出werable intent,接下來我們還需要創(chuàng)建wearable action來對該intent加以使用*/
- NotificationCompat.Action wearable_action = new NotificationCompat.Action.Builder(
- android.R.drawable.ic_dialog_email,
- getString(R.string.wearable_action),
- wearable_pending_intent).build();
接下來,我們如下所示利用extend方法將該活動添加到notification_builder對象當中。
- /*
- *我們在這里創(chuàng)建通知,
- *并將所有需要使用的屬性添加至其中。
- */
- notification_builder = new NotificationCompat.Builder(this)
- .setSmallIcon(R.drawable.ic_launcher)
- .setContentTitle(getString(R.string.notification_title))
- .setContentText(getString(R.string.notification_text))
- /*
- *這一方法要求我們的通知包含所有必要的默認通知特征,
- *例如聲音與振作機制。
- */
- .setDefaults(Notification.DEFAULT_ALL)
- /*這一方法將在被點觸時忽略當前通知信息。*/
- .setAutoCancel(true)
- .setContentIntent(pending_intent)
- /*
- *大家可以在這里向自己的移動設備添加活動,
- *需要注意我們所添加的活動數(shù)量。
- *在本示例以及大多數(shù)情況下,活動數(shù)量越少越好。
- */
- .addAction(android.R.drawable.ic_dialog_info, getString(R.string.first_action), twitter_intent)
- /*
- *我們在這里添加只適用于可穿戴設備的活動。
- *該活動不會被顯示在移動設備之上。
- */
- .extend(new WearableExtender().addAction(wearable_action));
運行應用程序,點觸該按鈕從而在自己的可穿戴設備上顯示通知內容。實際運行效果應該與可穿戴模擬器上的彈出通知有所不同。
總結
智能手表可謂蓄勢待發(fā),至少在未來一段時間內它將成為全世界的關注重點,因此充分利用這種新型通信方式服務于應用程序用戶就顯得至關重要。我希望大家能夠從今天的文章中找到亮點與收獲,也歡迎各位通過評論欄與我們分享您的建議與意見。
原文鏈接:Enhanced and Wearable-Ready Notifications on Android
核子可樂譯