安卓通知开发指南:延迟意图(PendingIntent)使用教程

欢迎使用安卓系统的PendingIntent通知示例。在本教程中,我们将讨论和实现PendingIntent,并在我们的应用程序中构建通知。

安卓延迟意图

安卓系统的PendingIntent是一个封装了Intent对象的对象,它指定了在未来要执行的操作。换句话说,PendingIntent允许我们将一个未来的Intent传递给另一个应用程序,并允许该应用程序在调用Intent时具有与我们的应用程序相同的权限,无论我们的应用程序在Intent最终被调用时是否还存在。PendingIntent通常用于需要执行AlarmManager的情况,或者用于通知(在本教程中稍后实现)。PendingIntent提供了一种让应用程序在其进程退出后继续工作的方法。出于安全原因,提供给PendingIntent的基本Intent必须明确设置组件名称,以确保它最终被发送到正确的地方而不是其他地方。每个明确的Intent都应由特定的应用程序组件(如Activity、BroadcastReceiver或Service)进行处理。因此,PendingIntent使用以下方法来处理不同类型的意图:

  • PendingIntent.getActivity() :获取一个用于启动Activity的PendingIntent
  • PendingIntent.getBroadcast() :获取一个用于执行广播的PendingIntent
  • PendingIntent.getService() :获取一个用于启动服务的PendingIntent

以下是一个 PendingIntent 的实例实现。

Intent intent = new Intent(this, SomeActivity.class);
 
// 创建一个pendingIntent并包装我们的intent
PendingIntent pendingIntent = PendingIntent.getActivity(this, 1, intent, PendingIntent.FLAG_UPDATE_CURRENT);
try {
    // 执行与我们的pendingIntent相关联的操作
    pendingIntent.send();
} catch (PendingIntent.CanceledException e) {
    e.printStackTrace();
}

与pendingIntent相关联的操作是使用send()方法执行的。下面描述了getActivity()方法中的参数及其用法。

  • 这是PendingIntent启动活动的上下文。
  • requestCode: “1”是发送者在上面的示例中使用的私有请求码。稍后再次使用相同的方法,并使用相同的请求码,将返回相同的待定意图。然后我们可以做一些其他的事情,比如使用cancel()取消待定意图等。
  • intent: 要启动的活动的显式意图对象。
  • flag: 在上面的示例中,我们使用了FLAG_UPDATE_CURRENT中的一个PendingIntent标志。这个标志表示,如果先前已经存在一个PendingIntent,那么当前的PendingIntent将使用最新的意图进行更新。还有许多其他的标志,如FLAG_CANCEL_CURRENT等。

安卓通知

安卓系统的Toast类提供了一种方便的方式来向用户显示警报,但问题是这些警报不是持久的,也就是说警报会在屏幕上闪现几秒钟然后消失。在这种情况下,安卓系统的通知消息来填补这个空白。安卓通知是我们可以在应用程序正常的用户界面之外向用户显示的消息。在安卓系统中,通知是使用NotificationCompat库构建的。

创建安卓通知

使用如下代码创建通知:NotificationManager类

NotificationManager notificationManager = (NotificationManager) 
  getSystemService(NOTIFICATION_SERVICE); 

Notification.Builder提供一个构建器接口,用于创建Notification对象,如下所示:

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

安卓通知方法

我们可以在此构建器对象上设置通知属性。以下是一些常用方法及其描述。

  • build()通知:将所有已设置的选项组合起来,并返回一个新的Notification对象
  • setAutoCancel (boolean autoCancel):设置此标志将使得当用户在面板中点击通知时,通知自动被取消
  • setContent (RemoteViews views):提供一个自定义的RemoteViews,用于替代标准视图
  • setContentInfo (CharSequence info):设置通知右侧的大文本
  • setContentIntent (PendingIntent intent):提供一个在通知被点击时发送的PendingIntent
  • setContentText (CharSequence text):设置通知的文本(第二行),格式是标准通知
  • setContentTitle (CharSequence title):设置通知的文本(第一行),格式是标准通知
  • setDefaults (int defaults):设置将被使用的默认通知选项。例如:mBuilder.setDefaults(Notification.DEFAULT_LIGHTS | Notification.DEFAULT_SOUND)
  • setLargeIcon (Bitmap icon):设置在滚动条和通知中显示的大图标
  • setNumber (int number):设置通知右侧的大数字
  • setOngoing (boolean ongoing):设置是否为持续通知
  • setSmallIcon (int icon):设置通知布局中使用的小图标
  • setStyle (NotificationCompat.Style style):在构建时添加一个丰富的通知样式
  • setTicker (CharSequence tickerText):设置通知到达时在状态栏中显示的文本
  • setVibrate (long[] pattern):设置要使用的振动模式
  • setWhen (long when):设置事件发生的时间。面板中的通知按此时间排序。

安卓通知按钮和样式

Notification.Builder允许您在通知中添加最多三个具有可定义操作的按钮。安卓系统4.1及以上的版本支持可展开的通知,当通知被展开时,会显示通知的大视图。大视图有三种样式可供使用:大图片样式、大文本样式和收件箱样式。

取消安卓通知

我们还可以在NotificationManager上为特定的通知ID调用cancel()方法。调用cancelAll()方法将会移除先前发出的所有通知。在本教程中,我们将创建一个应用程序,将用于查看网页的意图包装到PendingIntent中。当通知被点击时,该PendingIntent将被触发。此外,我们还将添加以编程方式取消通知的功能。

安卓通知示例项目结构

安卓通知示例

activity_main.xml是一个基本的相对布局,包含两个按钮:一个用于创建通知,另一个用于取消通知。

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="https://schemas.android.com/apk/res/android"
    xmlns:tools="https://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="com.Olivia.notifications.MainActivity">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="创建通知"
        android:id="@+id/button"
        android:layout_alignParentTop="true"
        android:layout_alignParentRight="true"
        android:layout_alignParentEnd="true"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="取消通知"
        android:id="@+id/button2"
        android:layout_below="@+id/button"
        android:layout_alignRight="@+id/button"
        android:layout_alignEnd="@+id/button"
        android:layout_alignParentLeft="true"
        android:layout_alignParentStart="true" />
</RelativeLayout>

下面给出了MainActivity.java文件的内容。

package com.Olivia.notifications;

import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.app.NotificationCompat;
import android.widget.Toast;

import butterknife.ButterKnife;
import butterknife.OnClick;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ButterKnife.inject(this);
    }

    @OnClick(R.id.button)
    public void sendNotification() {

        NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
        builder.setSmallIcon(android.R.drawable.ic_dialog_alert);
        Intent intent = new Intent(Intent.ACTION_VIEW, Uri.parse("https://www.scdev.com/"));
        PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 0);
        builder.setContentIntent(pendingIntent);
        builder.setLargeIcon(BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher));
        builder.setContentTitle("通知标题");
        builder.setContentText("您的通知内容在这里。");
        builder.setSubText("点击查看网站。");

        NotificationManager notificationManager = (NotificationManager) getSystemService(NOTIFICATION_SERVICE);

        // 将在通知栏中显示通知
        notificationManager.notify(1, builder.build());
    }

    @OnClick(R.id.button2)
    public void cancelNotification() {

        String ns = Context.NOTIFICATION_SERVICE;
        NotificationManager nMgr = (NotificationManager) getApplicationContext().getSystemService(ns);
        nMgr.cancel(1);
    }
}

在上述代码中,我们将一个关于此网站的意图传递给了PendingIntent。notificationId被设为1,并且被用来构建通知和取消通知。应用程序的运行效果如下所示。这就结束了有关使用PendingIntent的安卓通知教程。您可以通过下面的链接下载安卓通知项目。

下载Android PendingIntent和Notifications项目

参考资料:

  • https://developer.android.com/reference/android/app/PendingIntent.html
  • https://developer.android.com/guide/topics/ui/notifiers/notifications.html
bannerAds