Android 简明教程
Android - Notifications
Android Toast 类提供了一种方便的方式向用户展示警报,但问题在于这些警报并非持久性,也就是说,警报会在屏幕上闪烁几秒钟后消失。
要查看通知的详细信息,你必须选择图标,该图标会显示包含通知详细信息的通知抽屉。在使用带有虚拟设备的模拟器时,你必须点击并向下拖拽状态栏以将其展开,这会为你提供如下详细信息。这将只是 64 dp 高,并称为常规视图。
上述展开表单可以具有 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 对象后,你可以使用生成器对象根据需要设置其通知属性。但至少设置以下设置是强制性的 −
-
由 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 的参考文档。
Step 3 - Attach Actions
此部分为可选部分,如果您想要在通知中附加操作,则为必需部分。操作允许用户直接从通知访问您应用中的 Activity ,他们可在其中查看一个或多个事件或执行进一步的操作。
操作由包含 Intent 的 PendingIntent 定义,该 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 并启动它,如果你的设置和应用程序一切都正常,它将显示以下仿真器窗口 −
现在单击 button ,你会看到顶部有一条信息“新消息提醒!”会短暂显示,之后你会看到一个在左上角有一个小图标的屏幕。
现在让我们展开视图,长按小图标,一秒钟后它会显示日期信息,此时你应该在不松开鼠标的情况下向下拖动状态栏。你会看到状态栏展开,并且你会看到以下屏幕 −
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());
}
现在如果你尝试运行你的应用程序,那么你会在视图的展开形式中找到以下结果 −