Unlimited Plugins, WordPress themes, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Code
  2. Android
Code

如何在Android中进行推送通知

by
Difficulty:IntermediateLength:LongLanguages:

Chinese (Simplified) (中文(简体)) translation by yaling (you can also view the original English article)

介绍

让用户安装您的应用程序只成功了一半。 另一半是让他们定期使用。 很有可能您的用户在使用一次或两次后完全忘记了您的应用。 与所有其他新的应用程序竞争吸引用户的注意力。

通过使用推送通知,您可以随时提醒用户想到您的应用程序,从而提高应用程序继续保留在其设备上的机会。

Google Cloud Messaging(简称GCM)是一种免费服务,可用于向用户发送推送通知。 在本教程中,您将学习如何使用它来创建可以接收推送通知的Android应用程序,以及可以生成和发送推送通知的简单服务端Python脚本。

为什么要使用Google Cloud Messaging?

对于大多数客户端 - 服务器通信模式而言,客户端从服务器请求数据。 换句话说,客户端主动从服务器获取数据。 然而,在推送通知情况下,服务器主动向客户端传输数据。

这通常是通过在服务器和客户端之间维持一个持续的TCP / IP连接(无限期保持连接)来实现的。 这听起来可能很好,但如果你的应用程序很受欢迎,那么维护数千个服务器和用户设备之间的连接可能非常昂贵。

Google Cloud Messaging通过充当服务器和用户设备之间的中介来解决此问题。 使用GCM,Google的云连接服务器(通常称为CCS)会管理连接的持续性。它还确保您的推送通知安全可靠地交付。 准备工作

准备工作

为了与我保持一致,你需要:

1.设置Android Studio项目

启动Android Studio并创建一个空Activity的新项目。 如果您使用默认值,项目的MainActivity.java中包含一个Java类。

步骤1:添加依赖关系

在这个项目中,我们将使用Google Services gradle插件来配置GCM。 通过在项目build.gradle的部分添加以下行将dependencies包含在项目中:

接下来,将插件应用到app模块的build.gradle中:

为了能够使用GCM API,在同一个文件添加com.google.android.gms:play-services 作为compile依赖:

如果您单击立即同步按钮,您应该会看到以下错误:

Install Repository and sync project

单击安装存储库并同步项目链接以修复错误。

步骤2:更新清单文件

在项目的AndroidManifest.xml文件中,根据项目的包名称创建并使用自定义的C2D_MESSAGE权限。 确保权限的protectionLevel被设置为签名

以广播的形式收到通知。 为了处理这些广播,我们的应用需要一个BroadcastReceiver。 但是,我们不必手动创建它。 我们可以使用GcmReceiver类作为BroadcastReceiver

BroadcastReceiver必须有一个intent-filter响应com.google.android.c2dm.intent.RECEIVE的action并且它的category必须与项目的包名称相匹配。 将以下代码添加到清单中:

2.获取服务器API密钥和发件人ID

在与Cloud Connection Server进行通信时,我们需要使用服务器端的API密钥和客户端的发件人ID来识别自己。 要获取API密钥和发件人ID,请在开发者控制台中创建一个新项目

Welcome screen

首先点击选择平台按钮。 接下来,点击为我的Android应用程序启用服务按钮。 当您这样做时,您将被要求为您的应用程序提供一个名称和一个Android包名。 确保您提供的Android包名与您在创建Android Studio项目时输入的包名相匹配。

Project details

接下来,点击底部的选择并配置服务按钮。 您现在可以选择要添加到该应用的Google服务。

Available Google Services

现在,点击云消息按钮,然后点击启用Google Cloud Messaging。 几秒钟后,您将看到您的服务器API密钥和发件人ID。 记下服务器API密钥,然后点击关闭

Server API key and sender ID

我们之前添加的Google Services插件需要配置文件才能正常工作。 通过单击生成配置文件按钮生成文件。

文件生成完成后,将其下载并放置在Android Studio项目的app目录中。

3.注册客户端

GCM使用注册令牌识别Android设备。 因此,我们的应用程序必须能够从安装它的每个Android设备注册。

步骤1:创建注册服务

注册必须在后台线程上完成,因为需要网络连接,进程可能需要一段时间。 因为注册不需要用户的任何输入,所以IntentService是这个任务的理想选择。

创建一个名为RegistrationService.java的新Java类,使其成为IntentService的子类,并重写onHandleIntent方法。

onHandleIntent方法中,我们可以使用Instance ID API来生成或获取注册令牌。 首先,InstanceID使用它的getInstance方法创建一个类的实例。

我们现在可以使用InstanceID对象的getToken方法来获取一个注册令牌字符串getToken方法需要发件人ID作为其参数之一。 因为我们已将google-services.json文件添加到我们的项目中,我们可以将发件人ID传递给使用R.string.gcm_defaultSenderID的方法。

如果要查看注册令牌的内容以进行调试,可以使用Log.d方法将其记录为调试消息。

此时,您可以将注册令牌发送到您的Web服务器,并将其存储在数据库中。 但是,如果您不打算单独处理您的用户,则无需执行此操作。 如果您计划向每个用户发送相同的消息,您应该遵循发布订阅方式。

我现在将展示如何订阅一个名为my_little_topic的主题topic。 它只需要两行代码。 首先,使用GcmPubSub类的getInstance方法创建新实例。 接下来,调用其subscribe方法并将注册令牌与主题的名称一起传递给它。

我们的应用程序现在可以收到发布到my_little_topic的每个推送通知。

最后,在AndroidManifest.xml中定义服务。

注册服务完成。

步骤2:创建一个 InstanceIDListenerService

注册令牌定期刷新。 因此,使用GCM的每个Android应用程序都必须具有可以处理这些刷新功能的InstanceIDListenerService。 因此,创建一个名为TokenRefreshListenerService.java的新Java文件,并将其作为InstanceIDListenerService的子类。 在InstanceIDListenerService类的onTokenRefresh方法中,我们需要做的只是通过使用一个IntentstartService方法启动注册服务来再次启动注册进程。

将以下代码添加到TokenRefreshListenerService.java中:

此服务必须能够响应com.google.android.gms.iid.InstanceID的action。 因此,在AndroidManifest.xml中定义服务的同时,添加相应的intent-filter

步骤3:启动注册服务

为了确保注册过程在应用程序启动后立即开始,我们必须在MainActivity类的onCreate方法中启动RegistrationService类。 为此,请创建一个Intent并使用startService方法。

4.显示推送通知

GCM在收到通知后立即自动显示推送通知。 但是,只有在关联的应用程序包含GCMListenerService时才会这样做。

创建一个名为NotificationsListenerService的新Java类,并将其作为GCMListenerService的子类。 除非你想自己处理推送的数据,否则你不必在这个类中写任何代码。 现在我们可以把这个类处理为空。

AndroidManifest.xml中定义服务的同时,确保添加一个可以响应com.google.android.c2dm.intent.RECEIVE action的intent-filter

5.添加推送通知图标

每个推送通知都必须有一个与之关联的图标。 如果您没有,您可以从Google’s Material Design Icons Library中获得。

Material design icons library

下载图标后,将其放在项目的res文件夹中。 我将使用ic_cloud_white_48dp作为图标。

6.运行Android应用程序

我们的Android应用程序现已完成。 一旦您编译并运行在Android设备上,您将可以在logcat日志中看到注册令牌。

Registration token in logcat

点击设备上的后退按钮退出应用程序。 这是必要的,因为只有当用户没有使用该应用程序时,GCM才会自动显示推送通知。 如果您想要即使应用程序正在运行也要显示通知,您将不得不使用Notification.Builder类创建NotificationsListenerService里面的通知。

7.发送推送通知

在本教程的最后部分,我们将创建一个简单的Python脚本,可以生成并发送推送通知给安装了我们应用程序的所有Android设备。

您可以从本地计算机或具有SSH访问权限的远程Web服务器运行此脚本。

步骤1:创建脚本

创建一个名为send.py的新文件,并使用文本编辑器打开它。

在文件的顶部,导入urllib2urllib模块。 我们使用这些模块将数据发送到Google的Cloud Connection Server。 导入json模块是因为我们发送的数据必须是有效的JSON。 最后,要访问命令行参数,请导入sys模块。

接下来,创建一个变量用来存储您之前记下的服务器API密钥。 该服务器API密钥需要成为每个CCS HTTP请求的一部分。

每个通知必须有一个标题和一个正文。 我们不用在脚本中对它们进行硬编码,而是使用argv数组接受标题和正文作为命令行参数。

创建一个新的Python字典对象来表示应发送给CCS的数据。 对于可以接收通知的Android应用程序,它必须发布到一个名为my_little_topic的主题。 因此,给字典添加一个键,并将其值设置为/ topics / my_little_topic

要表示通知的内容,请将名为通知的键添加到字典中,并将其值设置为另一个包含三个键的字典对象:

  • 内容
  • 标题
  • 图标

确保icon键的值与您的Android项目中图片的图标名称相匹配。

使用模块的dumps功能将字典转换为JSON字符串json

我们现在需要做的是将JSON字符串发送到https://gcm-http.googleapis.com/gcm/send. 为此,创建一个新Request对象并数据设置为dataAsJSON。 接下来,设置Authorization头为MY_API_KEY和所述Content-type头设为application/json

最后,要执行请求并获取响应,请将请求对象传递给urlopen函数并调用其read方法。

Python脚本现在已经完成并可以使用了。

步骤2:运行脚本

此时,我们已准备好将推送通知发送到安装我们的应用程序的所有设备。 打开终端并输入您创建的send.py的目录。

将脚本的名称传递给python可执行文件以及通知标题的字符串,另一个用于通知的正文。 以下是您可以使用的示例:

如果没有错误,您应该得到如下回应:

如果您检查您的Android设备,则应在通知栏中看到新的通知。

Push notification in notification tray

结论

您现在应该知道了如何向用户发送推送通知。 在本课中,您学习了如何创建一个能够注册自己的Android应用程序,以及接收特定主题的通知。 您还学习了如何创建可以发布通知的Python脚本。

尽管推送通知可能是与用户进行沟通的有效方式,但我建议您谨慎使用它,只有当有用的信息需要传递时才发送推送通知,因为发送太多推送通知反而可能使得应用程序被卸载。

要了解有关Google云消息传递的更多信息,请参阅“ 云消息传递指南”。

关注我们的公众号
Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.