Android 简明教程

Android - Notifications

Android Toast 类提供了一种方便的方式向用户展示警报,但问题在于这些警报并非持久性,也就是说,警报会在屏幕上闪烁几秒钟后消失。

notification bar

要查看通知的详细信息,你必须选择图标,该图标会显示包含通知详细信息的通知抽屉。在使用带有虚拟设备的模拟器时,你必须点击并向下拖拽状态栏以将其展开,这会为你提供如下详细信息。这将只是 64 dp 高,并称为常规视图。

notification detail

上述展开表单可以具有 Big View ,其中包含通知的其他详细信息。你可以在通知中添加多达六行其他行。下面的屏幕快照显示了这样的通知。

Create and Send Notifications

你可以使用简单的方式创建一个通知。在应用程序中按照下列步骤创建通知 −

Step 1 - Create Notification Builder

第一步是使用 NotificationCompat.Builder.build() 创建一个通知生成器。你将使用通知生成器设置各种通知属性,如其小图标和大图标、标题、优先级等。

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

Step 2 - Setting Notification Properties

在你拥有 Builder 对象后,你可以使用生成器对象根据需要设置其通知属性。但至少设置以下设置是强制性的 −

  1. setSmallIcon() 设置的一个小图标

  2. setContentTitle() 设置的一个标题

  3. setContentText() 设置的详细信息文本

mBuilder.setSmallIcon(R.drawable.notification_icon);
mBuilder.setContentTitle("Notification Alert, Click Me!");
mBuilder.setContentText("Hi, This is Android Notification Detail!");

您拥有大量可为通知设置的可选属性。要了解更多信息,请参阅 NotificationCompat.Builder 的参考文档。

Step 3 - Attach Actions

此部分为可选部分,如果您想要在通知中附加操作,则为必需部分。操作允许用户直接从通知访问您应用中的 Activity ,他们可在其中查看一个或多个事件或执行进一步的操作。

操作由包含 IntentPendingIntent 定义,该 Intent 会在应用中启动活动。要将 PendingIntent 与手势关联,请调用 NotificationCompat.Builder 的适当方法。例如,如果您想在用户点击通知抽屉中的通知文本时启动活动,则可以通过调用 setContentIntent() 来添加 PendingIntent。

PendingIntent 对象可帮助您在应用程序需要时执行操作,通常在稍后执行,而无需关心您的应用程序是否在运行。

我们利用 Stack 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);

Step 4 - Issue the notification

最后,您通过调用 NotificationManager.notify() 将 Notification 对象传递到系统以发送您的通知。确保在通知之前调用构建器对象上的 NotificationCompat.Builder.build() 方法。此方法将组合已设置的所有选项并返回新的 Notification 对象。

NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

// notificationID allows you to update the notification later on.
mNotificationManager.notify(notificationID, mBuilder.build());

The NotificationCompat.Builder Class

NotificationCompat.Builder 类能够更轻松地控制所有标志,并帮助构建典型的通知布局。以下是 NotificationCompat.Builder 类的一部分中提供的一些重要且最常用的方法。

Sr.No.

Constants & Description

1

Notification build() 组合已设置的所有选项并返回新的通知对象。

2

NotificationCompat.Builder setAutoCancel (boolean autoCancel) 设置此标志将使通知在用户在面板中点击它时自动取消。

3

NotificationCompat.Builder setContent (RemoteViews views) 提供自定义 RemoteView,以替代标准 RemoteView。

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) 设置在 Ticker 和通知中显示的大图标。

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) 设置事件发生的时间。面板中的通知按此时间排序。

Example

以下示例展示了在 Android 4.1 中引入的 NotificationCompat.Builder 类使用的 Android 通知的功能。

Step

Description

1

你将使用 Android Studio IDE 创建一个 Android 应用程序,并将其命名为 tutorialspoint,放置在包 com.example.notificationdemo 中。

2

修改 src/MainActivity.java 文件,添加 notify("") 代码,如果用户单击该按钮,它将调用 Android 通知服务。

3

创建一个新的 Java 文件 src/NotificationView.java,它将用于显示新布局,作为当用户单击任何通知时将启动的新活动的一部分

4

修改布局 XML 文件 res/layout/activity_main.xml,在相关布局中添加“通知”按钮。

5

创建一个新的布局 XML 文件 res/layout/notification.xml。当用户单击任何通知时,它将用作启动新活动时的新活动布局文件。

6

无需更改默认的字符串常量。Android studio 会处理默认字符串常量

7

运行应用,以启动 Android 模拟器,并验证应用中已执行的更改。

以下是被修改的主活动文件 src/com.example.notificationdemo/MainActivity.java 的内容。此文件可以包括每个基本生命周期方法。

package com.example.notificationdemo;

import android.app.Activity;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.support.v4.app.NotificationCompat;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;

public class MainActivity extends Activity {
   Button b1;
   @Override
   protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.activity_main);

      b1 = (Button)findViewById(R.id.button);
      b1.setOnClickListener(new View.OnClickListener() {
         @Override
         public void onClick(View v) {
            addNotification();
         }
      });
   }

   private void addNotification() {
      NotificationCompat.Builder builder =
         new NotificationCompat.Builder(this)
         .setSmallIcon(R.drawable.abc)
         .setContentTitle("Notifications Example")
         .setContentText("This is a test notification");

      Intent notificationIntent = new Intent(this, MainActivity.class);
      PendingIntent contentIntent = PendingIntent.getActivity(this, 0, notificationIntent,
         PendingIntent.FLAG_UPDATE_CURRENT);
      builder.setContentIntent(contentIntent);

      // Add as notification
      NotificationManager manager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
      manager.notify(0, builder.build());
   }
}

以下是 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>

以下是 src/com.example.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 文件的内容——

<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"
   android:paddingBottom="@dimen/activity_vertical_margin"
   android:paddingLeft="@dimen/activity_horizontal_margin"
   android:paddingRight="@dimen/activity_horizontal_margin"
   android:paddingTop="@dimen/activity_vertical_margin"
   tools:context="MainActivity">

   <TextView
      android:id="@+id/textView1"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Notification Example"
      android:layout_alignParentTop="true"
      android:layout_centerHorizontal="true"
      android:textSize="30dp" />

   <TextView
      android:id="@+id/textView2"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Tutorials point "
      android:textColor="#ff87ff09"
      android:textSize="30dp"
      android:layout_below="@+id/textView1"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="48dp" />

   <ImageButton
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:id="@+id/imageButton"
      android:src="@drawable/abc"
      android:layout_below="@+id/textView2"
      android:layout_centerHorizontal="true"
      android:layout_marginTop="42dp" />

   <Button
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:text="Notification"
      android:id="@+id/button"
      android:layout_marginTop="62dp"
      android:layout_below="@+id/imageButton"
      android:layout_centerHorizontal="true" />

</RelativeLayout>

以下是 res/values/strings.xml 的内容,用于定义两个新常量——

<?xml version="1.0" encoding="utf-8"?>
<resources>
   <string name="action_settings">Settings</string>
   <string name="app_name">tutorialspoint </string>
</resources>

以下是 AndroidManifest.xml 的默认内容−

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
   package="com.example.notificationdemo" >

   <application
      android:allowBackup="true"
      android:icon="@drawable/ic_launcher"
      android:label="@string/app_name"
      android:theme="@style/AppTheme" >

      <activity
         android:name="com.example.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>

让我们来试着运行你的 tutorialspoint 应用程序。我假设你在设置环境时创建了你的 AVD 。若要从 Android Studio 运行 APP,请打开其中一个项目的活动文件,并单击工具栏中的运行图标。Android Studio 将应用程序安装到你的 AVD 并启动它,如果你的设置和应用程序一切都正常,它将显示以下仿真器窗口 −

noti2

现在单击 button ,你会看到顶部有一条信息“新消息提醒!”会短暂显示,之后你会看到一个在左上角有一个小图标的屏幕。

现在让我们展开视图,长按小图标,一秒钟后它会显示日期信息,此时你应该在不松开鼠标的情况下向下拖动状态栏。你会看到状态栏展开,并且你会看到以下屏幕 −

noti3

Big View Notification

以下代码片段演示如何更改在上一个片段中创建的通知,以使用收件箱大视图样式。我将更新 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());
}

现在如果你尝试运行你的应用程序,那么你会在视图的展开形式中找到以下结果 −

55qtk3