Android的Toast 類提供了一個方便的方式來顯示使用者的警告資訊,但這些警告不是永續性的,這意味著警告閃爍在螢幕上幾秒鐘後就消失了。
對於特別重要的要提供給使用者的訊息,需要有更永續性的方法。 Anotification是一種訊息可以顯示在裝置的頂部的通知欄或狀態列中。
要看到通知的細節,選擇圖示顯示通知抽屜裡有詳細的有關通知。模擬器虛擬裝置工作,按一下向下拖動狀態列將它展開,將顯示詳細資訊如下。這將是64 sp高的普通檢視。
上述擴大的形式可以放到一個大的檢視,有關通知的更多細節。可以新增最多六行的通知。下面的截圖顯示了這樣的通知。
使用簡單的方法來建立一個通知。按照以下步驟在應用程式建立一個通知:
作為第一步建立一個通知構造器,使用NotificationCompat.Builder.build()。使用通知Builder來設定屬性,如各種通知其小型和大型圖示,標題,優先順序等。
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
在建立Builder物件之後,可以按要求使用生成器建立通知物件。這是強制性的,以至少下列設定:
一個小圖示,由 setSmallIcon() 設定
一個標題,由setContentTitle() 設定
詳細內容由 setContentText() 設定
mBuilder.setSmallIcon(R.drawable.notification_icon); mBuilder.setContentTitle("Notification Alert, Click Me!"); mBuilder.setContentText("Hi, This is Android Notification Detail!");
通知有很多可選的屬性,可以設定。要更多地了解它們,請參考 NotificationCompat.Builder 文件。
這是一個可選的部分,並要求如果要附加一個動作的通知。動作可以讓使用者直接從通知到應用程式中的活動,在那裡它們可以在一個或多個事件,或做進一步的工作。
動作定義通過PendingIntent 在應用程式中的活動意圖。要關聯PendingIntent 手勢請呼叫適當NotificationCompat.Builder 方法。例如,如果想開始活動,當使用者點選通知文字通知抽屜 PendingIntent 呼叫setContentIntent()。
PendingIntent物件表示應用程式的執行一個動作,在以後的時間裡檢視應用程式是否正在執行。
堆疊builder物件將包含一個人工後退堆疊活動。確保向後導航的活動在應用程式的主螢幕。
Intent resultIntent = new Intent(this, ResultActivity.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(ResultActivity.class); // Adds the Intent that starts the Activity to the top of the stack stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent);
最後,呼叫NotificationManager.notify() 傳送通知,通知物件傳遞到系統。通知之前,確保呼叫NotificationCompat.Builder.build()方法生成器物件。這種方法結合了所有的選擇,設定並返回一個新的Notificationobject。
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); // notificationID allows you to update the notification later on. mNotificationManager.notify(notificationID, mBuilder.build());
NotificationCompat.Builder類可以更容易控制標誌,以及幫助構建典型通知佈局。以下是 NotificationCompat.Builder類的一些重要的和最常用的方法的一部分。
S.N. | 常數& 描述 |
---|---|
1 |
Notification build() 結合所有已設定的選項,並返回一個新的 Notification 物件 |
2 |
NotificationCompat.Builder setAutoCancel (boolean autoCancel) 設定此標誌將使它以便當使用者點選它在面板中的通知被自動取消 |
3 |
NotificationCompat.Builder setContent (RemoteViews views) 提供客製化RemoteViews使用來代替標準之一 |
4 |
NotificationCompat.Builder setContentInfo (CharSequence info) 設定大文字的通知的右側 |
5 |
NotificationCompat.Builder setContentIntent (PendingIntent intent) 提供一個PendingIntent通知被點選時發出 |
6 |
NotificationCompat.Builder setContentText (CharSequence text) 設定通知的文字(第二行),在一個標準的通知 |
7 |
NotificationCompat.Builder setContentTitle (CharSequence title) 設定通知的文字(第一行),在一個標準的通知 |
8 |
NotificationCompat.Builder setDefaults (int defaults) 設定將要使用的預設通知選項 |
9 |
NotificationCompat.Builder setLargeIcon (Bitmap icon) 設定顯示在自動收報機和通知大圖示 |
10 |
NotificationCompat.Builder setNumber (int number) 在通知的右側設定大的數位 |
11 |
NotificationCompat.Builder setOngoing (boolean ongoing) 設定這是否是一個持續的通知 |
12 |
NotificationCompat.Builder setSmallIcon (int icon) 設定小圖示在通知使用布局 |
13 |
NotificationCompat.Builder setStyle (NotificationCompat.Style style) 在構建時應用新增豐富的通知樣式 |
14 |
NotificationCompat.Builder setTicker (CharSequence tickerText) 設定在第一個通知到達時顯示在狀態列中的文字 |
15 |
NotificationCompat.Builder setVibrate (long[] pattern) 設定振動模式的使用 |
16 |
NotificationCompat.Builder setWhen (long when) 設定該事件發生的時間。在面板的通知是由這個時間進行排序 |
以下範例顯示 Android 的通知功能,NotificationCompat.Builder類已在Android4.1中引入。
步驟 | 描述 |
---|---|
1 | 使用Android Studio建立一個Android應用程式,並將它命名為:NotificationDemounder。在建立這個專案時確保目標SDK和編譯在Android SDK的最新版本或更高階別的API。 |
2 | 修改 src/MainActivity.java 檔案,並新增定義三種方法startNotification(),cancelNotification()和updateNotification(),以涵蓋與Android的通知的最大功能的程式碼。 |
3 | 建立一個新的src/NotificationView.java,這將被用於顯示新的布局作為新的活動將被啟動的一部分,當使用者將點選通知 |
4 | 複製圖片woman.png在RES/ drawable-*檔案夾,這個圖片將被用作通知圖示。可以使用的情況下,要為他們提供了不同的裝置有不同的解析度的圖片 |
5 | 修改布局XML檔案 res/layout/activity_main.xml 新增三個按鈕的線性布局 |
6 | 建立一個新的布局XML檔案 res/layout/notification.xml。這將被用來作為佈局檔案為新的活動,將啟動時使用者將點選任何通知 |
7 | 修改 res/values/strings.xml 中定義所需的恆定值 |
8 | 執行該應用程式時啟動Android模擬器並驗證應用程式所做的修改結果 |
以下是修改主要活動檔案src/com.yiibai.notificationdemo/MainActivity.java 的內容。這個檔案可以包括每個生命週期基本方法。
package com.example.notificationdemo; import android.os.Bundle; import android.app.Activity; import android.app.NotificationManager; import android.app.PendingIntent; import android.app.TaskStackBuilder; import android.content.Context; import android.content.Intent; import android.support.v4.app.NotificationCompat; import android.util.Log; import android.view.View; import android.widget.Button; public class MainActivity extends Activity { private NotificationManager mNotificationManager; private int notificationID = 100; private int numMessages = 0; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Button startBtn = (Button) findViewById(R.id.start); startBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { displayNotification(); } }); Button cancelBtn = (Button) findViewById(R.id.cancel); cancelBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { cancelNotification(); } }); Button updateBtn = (Button) findViewById(R.id.update); updateBtn.setOnClickListener(new View.OnClickListener() { public void onClick(View view) { updateNotification(); } }); } protected void displayNotification() { Log.i("Start", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("New Message"); mBuilder.setContentText("You've received new message."); mBuilder.setTicker("New Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* notificationID allows you to update the notification later on. */ mNotificationManager.notify(notificationID, mBuilder.build()); } protected void cancelNotification() { Log.i("Cancel", "notification"); mNotificationManager.cancel(notificationID); } protected void updateNotification() { Log.i("Update", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("Updated Message"); mBuilder.setContentText("You've got updated message."); mBuilder.setTicker("Updated Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* Update the existing notification using same notification ID */ mNotificationManager.notify(notificationID, mBuilder.build()); } }
以下是修改的主活動檔案的內容 src/com.yiibai.notificationdemo/NotificationView.java.
package com.example.notificationdemo; import android.os.Bundle; import android.app.Activity; public class NotificationView extends Activity{ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.notification); } }
下面檔案 res/layout/activity_main.xml 的內容如下:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <Button android:id="@+id/start" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/start_note"/> <Button android:id="@+id/cancel" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/cancel_note" /> <Button android:id="@+id/update" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/update_note" /> </LinearLayout>
下面是 res/layout/notification.xml 檔案的內容:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="400dp" android:text="Hi, Your Detailed notification view goes here...." /> </LinearLayout>
下面檔案 res/values/strings.xml 的內容中定義兩個新的常數:
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="app_name">NotificationDemo</string> <string name="action_settings">Settings</string> <string name="hello_world">Hello world!</string> <string name="start_note">Start Notification</string> <string name="cancel_note">Cancel Notification</string> <string name="update_note">Update Notification</string> </resources>
下面是 AndroidManifest.xml 檔案的內容:
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.yiibai.notificationdemo" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="17" android:targetSdkVersion="17" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.yiibai.notificationdemo.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".NotificationView" android:label="Details of notification" android:parentActivityName=".MainActivity"> <meta-data android:name="android.support.PARENT_ACTIVITY" android:value=".MainActivity"/> </activity> </application> </manifest>
我們嘗試執行NotificationDemo 應用程式。AVD安裝的應用程式,並啟動它,如果一切設定和應用都沒有問題,它會顯示以下模擬器視窗:
現在單擊“Start Notification”通知按鈕,會看到在上面的一條訊息“New Message Alert!”將短暫顯示後,將有下面的螢幕左上角有一個小圖示。
現在,讓我們展開檢視,長按小圖示,一秒鐘後它會顯示日期資訊,這是時間的時候,應該釋放滑鼠拖動狀態列的情況下。會看到狀態列將擴大,會得到以下畫面:
現在,讓我們嘗試在影象上點選圖示,這將啟動新的活動,已設定使用的意圖,將有以下螢幕:
接下來,可以點選“Detail of notification”,將帶回到主螢幕,可以嘗試使用更新通知按鈕,將更新現有的通知和數量將增加1,但如果傳送通知,新的通知ID會繼續增加在堆疊中,會看到他們在螢幕上單獨列示。
下面的程式碼片斷演示了如何改變的通知,上面程式碼中建立使用收件箱大檢視樣式。要更新 displayNotification() 方法來顯示這個功能:
protected void displayNotification() { Log.i("Start", "notification"); /* Invoking the default notification service */ NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this); mBuilder.setContentTitle("New Message"); mBuilder.setContentText("You've received new message."); mBuilder.setTicker("New Message Alert!"); mBuilder.setSmallIcon(R.drawable.woman); /* Increase notification number every time a new notification arrives */ mBuilder.setNumber(++numMessages); /* Add Big View Specific Configuration */ NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle(); String[] events = new String[6]; events[0] = new String("This is first line...."); events[1] = new String("This is second line..."); events[2] = new String("This is third line..."); events[3] = new String("This is 4th line..."); events[4] = new String("This is 5th line..."); events[5] = new String("This is 6th line..."); // Sets a title for the Inbox style big view inboxStyle.setBigContentTitle("Big Title Details:"); // Moves events into the big view for (int i=0; i < events.length; i++) { inboxStyle.addLine(events[i]); } mBuilder.setStyle(inboxStyle); /* Creates an explicit intent for an Activity in your app */ Intent resultIntent = new Intent(this, NotificationView.class); TaskStackBuilder stackBuilder = TaskStackBuilder.create(this); stackBuilder.addParentStack(NotificationView.class); /* Adds the Intent that starts the Activity to the top of the stack */ stackBuilder.addNextIntent(resultIntent); PendingIntent resultPendingIntent = stackBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT ); mBuilder.setContentIntent(resultPendingIntent); mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE); /* notificationID allows you to update the notification later on. */ mNotificationManager.notify(notificationID, mBuilder.build()); }
現在,如果嘗試執行應用程式,然後會發現下面的結果檢視的擴充套件形式: