介绍
让用户安装您的应用程序仅是成功的一半。 让他们定期使用它是另一半。 仅使用一次或两次后,用户很有可能会完全忘记您的应用程序。 与所有其他新应用程序竞争他们的注意力的情况。
通过使用推送通知,您可以不时提醒用户有关您的应用程序的信息,从而提高应用程序在其设备上保持安装的机会。
Google Cloud Messaging (简称GCM)是一项免费服务,您可以用来向用户发送推送通知。 在本教程中,您将学习如何使用它来创建可以接收推送通知的Android应用程序,以及可以生成和发送通知的简单服务器端Python脚本。
为什么要使用Google Cloud Messaging?
对于大多数客户端-服务器通信,客户端会发起请求以从服务器接收数据。 换句话说,客户端从服务器提取数据。 但是,在推送通知的情况下,是服务器启动数据传输。
通常,这可以通过在服务器和客户端之间维护持久的TCP / IP连接(无限期保持打开状态的连接)来实现。 这听起来不错,但是如果您有一个流行的应用程序,则在服务器与用户设备之间维持数千个持久连接可能会非常昂贵。
Google Cloud Messaging是一项服务,可以通过充当服务器和用户设备之间的中介来解决此问题。 使用GCM,Google的Cloud Connection Server(通常称为CCS)可以为您管理持久连接。 它还可以确保安全可靠地传递您的推送通知。
先决条件
要跟随我,您需要:
- 最新版本的Android Studio
- Python 2.7.6或更高版本
- 安装了Google Play服务的运行Android 4.4或更高版本的设备
1.设置Android Studio项目
启动Android Studio并使用一个空的Activity
创建一个新项目。 如果使用默认值,则该项目应在MainActivity.java中包含一个Java类。
步骤1:添加依赖项
在此项目中,我们将使用Google Services gradle插件来配置GCM。 通过在项目的build.gradle的dependencies
部分中添加以下行,将其包括在项目中:
classpath 'com.google.gms:google-services:1.5.0'
接下来,在app
模块的build.gradle中 app
插件:
apply plugin: 'com.google.gms.google-services'
为了能够使用GCM API,请将com.google.android.gms:play-services
添加为同一文件中的compile
依赖项:
compile "com.google.android.gms:play-services:8.3.0"
如果单击立即同步按钮,应该看到以下错误:
单击安装存储库并同步项目链接以修复错误。
步骤2:更新清单
在项目的AndroidManifest.xml文件中,根据项目的程序包名称创建并使用自定义C2D_MESSAGE权限。 确保权限的protectionLevel
设置为signature 。
通知以广播形式接收。 要处理这些广播,我们的应用程序需要一个BroadcastReceiver
。 但是,我们不必手动创建它。 我们可以改用GcmReceiver
类作为BroadcastReceiver
。
BroadcastReceiver
必须具有一个响应com.google.android.c2dm.intent.RECEIVE
操作的intent-filter
,其category
名称必须与您项目的包名称相匹配。 将以下代码添加到清单中:
2.获取服务器API密钥和发件人ID
与Cloud Connection Server通信时,我们需要使用服务器端的API密钥和客户端的发件人ID来标识自己。 要获取API密钥和发送者ID,请在开发人员控制台中创建一个新项目 。
首先单击“ 选择平台”按钮。 接下来,点击为我的Android应用程序启用服务按钮。 这样做时,系统会要求您为应用提供名称和Android软件包名称。 确保您提供的Android软件包名称与创建Android Studio项目时输入的软件包名称匹配。
接下来,单击底部的“选择并配置服务”按钮。 现在,您可以选择要添加到应用程序的Google服务。
现在,点击Cloud Messaging按钮,然后点击Enable Google Cloud Messaging 。 几秒钟后,将显示服务器API密钥和发件人ID。 记下服务器API密钥,然后按Close 。
我们之前添加的Google Services插件需要一个配置文件才能正常工作。 通过单击“ 生成配置文件”按钮来生成文件 。
生成文件后,下载文件并将其放在Android Studio项目的应用目录中。
3.注册客户
GCM使用注册令牌识别Android设备。 因此,我们的应用必须能够从安装该应用的每个Android设备上进行注册。
步骤1:创建注册服务
注册必须在后台线程上完成,因为该过程可能需要一段时间,具体取决于网络连接性。 由于注册不需要用户的任何输入,因此IntentService
非常适合此任务。
创建一个名为RegistrationService.java的新Java类,使其成为IntentService
的子类,并覆盖其onHandleIntent
方法。
public class RegistrationService extends IntentService {
public RegistrationService() {
super("RegistrationService");
}
@Override
protected void onHandleIntent(Intent intent) {
}
}
在onHandleIntent
方法内部,我们可以使用实例ID API生成或获取注册令牌。 首先,使用其getInstance
方法创建InstanceID
类的InstanceID
。
InstanceID myID = InstanceID.getInstance(this);
现在,我们可以使用InstanceID
对象的getToken
方法获取String
形式的注册令牌。 getToken
希望将发送者ID作为其参数之一。 由于我们已将google-services.json文件添加到我们的项目中,因此我们可以使用R.string.gcm_defaultSenderID
将发件人ID传递给方法。
String registrationToken = myID.getToken(
getString(R.string.gcm_defaultSenderId),
GoogleCloudMessaging.INSTANCE_ID_SCOPE,
null
);
如果要查看注册令牌的内容以进行调试,可以使用Log.d
方法将其记录为调试消息。
Log.d("Registration Token", registrationToken);
此时,您可以将注册令牌发送到Web服务器,并将其存储在该数据库中。 但是,如果您不打算单独针对您的用户,则不必这样做。 如果打算将相同的消息发送给每个用户,则应遵循“发布-订阅”方法。
现在,我将向您展示如何订阅名为my_little_topic的topic
。 它只需要两行代码。 首先,使用其getInstance
方法创建GcmPubSub
类的新实例。 接下来,调用其subscribe
方法,并将注册令牌以及主题名称传递给该方法。
GcmPubSub subscription = GcmPubSub.getInstance(this);
subscription.subscribe(registrationToken, "/topics/my_little_topic", null);
我们的应用程序现在可以接收发布到my_little_topic的每个推送通知。
最后,在AndroidManifest.xml中定义服务。
注册服务已完成。
步骤2:建立InstanceIDListenerService
注册令牌会定期刷新。 因此,每个使用GCM的Android应用程序都必须具有InstanceIDListenerService
才能处理这些刷新。 因此,创建一个名为TokenRefreshListenerService.java的新Java文件,并使它成为InstanceIDListenerService
的子类。 在onTokenRefresh
方法内部,我们要做的只是简单地通过使用Intent
和startService
方法启动注册服务来再次启动注册过程。
将以下代码添加到TokenRefreshListenerService.java :
public class TokenRefreshListenerService extends InstanceIDListenerService {
@Override
public void onTokenRefresh() {
Intent i = new Intent(this, RegistrationService.class);
startService(i);
}
}
此服务必须能够响应com.google.android.gms.iid.InstanceID
操作。 因此,在AndroidManifest.xml中定义服务时,添加适当的intent-filter
。
步骤3:启动注册服务
为确保注册过程在应用程序启动后立即开始,我们必须在MainActivity
的onCreate
方法内启动RegistrationService
类。 为此,为其创建一个Intent
并使用startService
方法。
Intent i = new Intent(this, RegistrationService.class);
startService(i);
4.显示推送通知
收到推送通知后,GCM会自动在通知托盘中显示推送通知。 但是,只有在关联的应用程序包含GCMListenerService
,它才这样做。
创建一个名为NotificationsListenerService的新Java类,并将其作为GCMListenerService
的子类。 除非您想自己处理推送的数据,否则不必在此类内编写任何代码。 我们现在可以将该课程留空。
public class NotificationsListenerService extends GcmListenerService {
}
在AndroidManifest.xml中定义服务时,请确保添加一个intent-filter
,以使其能够响应com.google.android.c2dm.intent.RECEIVE
操作。
5.添加推送通知图标
每个推送通知都必须具有与其关联的图标。 如果您没有一个方便的工具,则可以从Google的Material Design图标库中获得一个。
下载图标后,将其放在项目的res文件夹中。 我将使用ic_cloud_white_48dp作为图标。
6.运行Android应用
我们的Android应用现已完成。 编译并在Android设备上运行后,您将能够在logcat日志中看到注册令牌。
按设备上的后退按钮以退出应用程序。 这是必要的,因为GCM仅在用户不使用应用程序时才会自动显示推送通知。 如果您希望即使在应用程序运行时也显示通知,则必须使用Notification.Builder
类在NotificationsListenerService
自己创建通知。
7.发送推送通知
在本教程的最后一部分,我们将创建一个简单的Python脚本,该脚本可以生成推送通知并将其发送到安装了我们应用程序的所有Android设备。
您可以从本地计算机或具有SSH访问权限的远程Web服务器运行此脚本。
步骤1:创建脚本
创建一个名为send.py的新文件,并使用您喜欢的文本编辑器将其打开。
在文件顶部,导入urllib2
和urllib
模块。 我们将使用这些模块将数据发送到Google的Cloud Connection Server。 还要导入json
模块,因为我们发送的数据必须是有效的JSON。 最后,要访问命令行参数,请导入sys
模块。
from urllib2 import *
import urllib
import json
import sys
接下来,创建一个变量,该变量存储您之前记下的服务器API密钥。 密钥必须包含在我们向CCS发出的每个HTTP请求中。
MY_API_KEY="ABCDEF123456789ABCDE--12A"
每个通知必须具有标题和正文。 与其在我们的脚本中对它们进行硬编码,不如使用argv
数组将标题和正文作为命令行参数接受。
messageTitle = sys.argv[1]
messageBody = sys.argv[2]
创建一个新的Python字典对象,以表示应发送到CCS的数据。 为了使我们的Android应用能够接收通知,必须将其发布到名为my_little_topic的主题。 因此,增加一个名为关键的字典,并将其值设置为/主题/ my_little_topic。
要表示通知的内容,请在字典中添加一个称为通知的键,并将其值设置为包含三个键的另一个字典对象:
- 身体
- 标题
- 图标
确保icon
键的值与您的Android项目中可绘制图标的名称匹配。
data={
"to" : "/topics/my_little_topic",
"notification" : {
"body" : messageBody,
"title" : messageTitle,
"icon" : "ic_cloud_white_48dp"
}
}
使用json
模块的dumps
函数将字典转换为JSON字符串:
dataAsJSON = json.dumps(data)
现在我们要做的就是将JSON字符串发送到https://gcm-http.googleapis.com/gcm/send 。 为此,创建一个新的Request
对象并将dataAsJSON
设置为其数据。 接下来,将Authorization
标头设置为MY_API_KEY
,并将Content-type
标头设置为application / json 。
request = Request(
"https://gcm-http.googleapis.com/gcm/send",
dataAsJSON,
{ "Authorization" : "key="+MY_API_KEY,
"Content-type" : "application/json"
}
)
最后,要执行请求并获取响应,请将请求对象传递给urlopen
函数并调用其read
方法。
print urlopen(request).read()
Python脚本现已完成,可以使用。
步骤2:执行指令码
至此,我们准备将推送通知发送到安装了我们应用程序的所有设备。 打开终端,然后输入在其中创建send.py的目录。
将脚本的名称以及一个用于通知标题的字符串和一个用于通知正文的字符串传递给python
可执行文件。 这是您可以使用的示例:
python send.py "My first push notification" "GCM API is wonderful!"
如果没有错误,您应该得到如下响应:
{"message_id":12345676892321}
如果您检查自己的Android设备,则应该在通知栏中看到一个新通知。
结论
现在,您知道了如何向用户发送推送通知。 在本课程中,您学习了如何创建一个能够注册自身并接收发布到特定主题的通知的Android应用。 您还学习了如何创建可以发布通知的Python脚本。
即使推送通知可能是与用户进行交流的一种好方法,但我还是建议您仅在有一些有用的话要谨慎使用,因为发送过多通知可能是获取应用程序的最快方法已卸载。
要了解有关Google Cloud Messaging的更多信息,请参阅Cloud Messaging Guide 。
翻译自: https://code.tutsplus.com/tutorials/how-to-get-started-with-push-notifications-on-android--cms-25870