Android(安卓)Notifications 通知
Notification 通知是可以在应用程序的正常 UI 之外向用户显示的消息。当您告诉系统发出通知时,它首先以图标的形式出现在通知区域中。要查看通知的详细信息,用户打开通知抽屉。通知区域和通知抽屉都是系统控制的区域,用户可以随时查看。
Android Toast
类提供了一种方便的方式来向用户显示警报,但问题是这些警报并不持久,这意味着警报在屏幕上闪烁几秒钟,然后消失。
要查看通知的详细信息,您必须选择图标,该图标将显示具有通知详细信息的通知抽屉(notification drawer)。在使用虚拟设备仿真器时,您必须单击并向下拖动状态栏以展开它,这将为您提供如下详细信息。这将只有 64 dp 高,称为普通视图。
上面展开的表单可以有一个大视图,其中将有关于通知的其他详细信息。您最多可以在通知中添加六行。下面的屏幕截图显示了这样的通知。
创建和发送通知
您有简单的方法创建通知。按照应用程序中的以下步骤创建通知:
步骤 1 - 创建通知构造器
第一步是使用 NotificationCompat.Builder.build()
创建通知构造器。您将使用通知构造器设置各种通知属性,如大小图标、标题、优先级等。
NotificationCompat.Builder mBuilder = new NotificationCompat.Builder(this)
步骤 2 - 设置通知属性
拥有 Builder
对象后,可以根据需要使用 Builder
对象设置其 Notification
属性。但这是强制性的,至少要设置以下内容:
- 使用 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 - 附加操作
这是一个可选部分,如果您想将操作与通知一起附加,则是必需的。操作允许用户直接从通知转到应用程序中的 Activity 活动,在那里他们可以查看一个或多个事件或执行进一步的工作。
该操作由一个 PendingIntent
定义,其中包含一个在应用程序中启动 Activity 的 Intent。要将 PendingIntent
与手势关联,请调用 NotificationCompat.Builder
的相应方法。例如,如果要在用户单击通知抽屉中的通知文本时启动 Activity,则可以通过调用 setContentIntent()
添加 PendingIntent
。
PendingIntent
对象可以帮助您代表应用程序执行操作,通常在稍后执行,而无需关心应用程序是否正在运行。
我们利用堆栈构建器对象的帮助,该对象将包含已启动活动的人工后堆栈。这样可以确保从 Activity 活动向后导航会从应用程序引导到主屏幕。
步骤 4 - 发布通知
最后,通过调用 NotificationManagernotify()
发送通知,将 Notification 对象传递给系统。在通知构造器对象之前,请确保对其调用 NotificationCompat.Builder.build()
方法。此方法组合了所有已设置的选项,并返回一个新的 Notification
对象。
NotificationManager mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
// notificationID 让您可以稍后更新通知。
mNotificationManager.notify(notificationID, mBuilder.build());
NotificationCompat.Builder 类
NotificationCompat.Builder
类允许更容易地控制所有标志,并帮助构建典型的通知布局。
以下是作为 NotificationCompat.Builder
类的一部分提供的几个重要且最常用的方法。
编号 | 常量 & 描述 |
---|---|
1 | Notification build() 组合已设置的所有选项并返回新的 Notification 对象。 |
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) 设置自动收听器和通知中显示的大图标。 |
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 4.1 中引入的 NotificationCompat.Builder
类的 Android 通知的功能。
步骤 | 描述 |
---|---|
1 | 您将使用 Android studio IDE 创建一个 Android 应用程序,并在 com.example.notificationdemo 包下将其命名为 My Application。 |
2 | 修改 src/MainActivity.java f文件并添加代码 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="My Application "
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">My Application </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>
让我们尝试运行 My Application 应用程序。我假设您在进行环境设置时创建了 AVD。要从 Android Studio 运行应用程序,请打开项目的 activity 文件之一,然后单击工具栏上的运行 Eclipse 图标。Android studio 在您的 AVD 上安装应用程序并启动它,如果您的设置和应用程序一切正常,它将显示以下模拟器窗口:
现在点击 按钮,你会在顶部看到一条消息 “New Message Alert!” 将立即显示,之后您将看到下面的屏幕,在左上角有一个小图标。
现在让我们展开视图,长时间单击小图标,一秒钟后它将显示日期信息,此时您应该在不释放鼠标的情况下向下拖动状态栏。您将看到状态栏将展开,您将看到以下屏幕:
大视图通知
下面的代码段演示了如何更改上一个代码段中创建的通知以使用收件箱大视图样式。我们将更新 displayNotification()
修改方法以显示此功能:
protected void displayNotification() {
Log.i("Start", "notification");
/* 调用默认通知服务 */
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);
/* 每次新通知到达时增加通知数 */
mBuilder.setNumber(++numMessages);
/* 添加大视图特定配置 */
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...");
// 为收件箱样式的大视图设置标题
inboxStyle.setBigContentTitle("Big Title Details:");
// 将事件移入大视图
for (int i=0; i < events.length; i++) {
inboxStyle.addLine(events[i]);
}
mBuilder.setStyle(inboxStyle);
/* 在应用程序中创建活动的明确意图 */
Intent resultIntent = new Intent(this, NotificationView.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(this);
stackBuilder.addParentStack(NotificationView.class);
/* 将启动活动的 Intent 添加到堆栈顶部 */
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent =stackBuilder.getPendingIntent(0,PendingIntent.FLAG_UPDATE_CURRENT);
mBuilder.setContentIntent(resultPendingIntent);
mNotificationManager = (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);
/* notificationID 让您可以稍后更新通知 */
mNotificationManager.notify(notificationID, mBuilder.build());
}