Android通知


Android的Toast 類提供了一個方便的方式來顯示使用者的警告資訊,但這些警告不是永續性的,這意味著警告閃爍在螢幕上幾秒鐘後就消失了。

對於特別重要的要提供給使用者的訊息,需要有更永續性的方法。 Anotification是一種訊息可以顯示在裝置的頂部的通知欄或狀態列中。

Android Notification Bar

要看到通知的細節,選擇圖示顯示通知抽屜裡有詳細的有關通知。模擬器虛擬裝置工作,按一下向下拖動狀態列將它展開,將顯示詳細資訊如下。這將是64 sp高的普通檢視。

Android Notification Detail

上述擴大的形式可以放到一個大的檢視,有關通知的更多細節。可以新增最多六行的通知。下面的截圖顯示了這樣的通知。

Android Notification Big View

建立和傳送通知

使用簡單的方法來建立一個通知。按照以下步驟在應用程式建立一個通知:

第1步 - 建立通知生成器

作為第一步建立一個通知構造器,使用NotificationCompat.Builder.build()。使用通知Builder來設定屬性,如各種通知其小型和大型圖示,標題,優先順序等。

NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)

第2步 - 設定通知屬性

在建立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 文件。

第3步 - 動作附加

這是一個可選的部分,並要求如果要附加一個動作的通知。動作可以讓使用者直接從通知到應用程式中的活動,在那裡它們可以在一個或多個事件,或做進一步的工作。

動作定義通過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);

第4步 - 發出通知

最後,呼叫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類可以更容易控制標誌,以及幫助構建典型通知佈局。以下是 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安裝的應用程式,並啟動它,如果一切設定和應用都沒有問題,它會顯示以下模擬器視窗:

Android Notification Start

現在單擊“Start Notification”通知按鈕,會看到在上面的一條訊息“New Message Alert!”將短暫顯示後,將有下面的螢幕左上角有一個小圖示。

Android Notification Start Icon

現在,讓我們展開檢視,長按小圖示,一秒鐘後它會顯示日期資訊,這是時間的時候,應該釋放滑鼠拖動狀態列的情況下。會看到狀態列將擴大,會得到以下畫面:

Android Notification Expanded

現在,讓我們嘗試在影象上點選圖示,這將啟動新的活動,已設定使用的意圖,將有以下螢幕:

Android Notification New Activity

接下來,可以點選“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());
   }

現在,如果嘗試執行應用程式,然後會發現下面的結果檢視的擴充套件形式:

Android Notification Big View