如何在Android上开始使用推送通知

介绍

让用户安装您的应用程序仅是成功的一半。 让他们定期使用它是另一半。 仅使用一次或两次后,用户很有可能会完全忘记您的应用程序。 与所有其他新应用程序竞争他们的注意力的情况。

通过使用推送通知,您可以不时提醒用户有关您的应用程序的信息,从而提高应用程序在其设备上保持安装的机会。

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.gradledependencies部分中添加以下行,将其包括在项目中:

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"

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

如何在Android上开始使用推送通知_第1张图片

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

步骤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上开始使用推送通知_第2张图片

首先单击“ 选择平台”按钮。 接下来,点击为我的Android应用程序启用服务按钮。 这样做时,系统会要求您为应用提供名称和Android软件包名称。 确保您提供的Android软件包名称与创建Android Studio项目时输入的软件包名称匹配。

如何在Android上开始使用推送通知_第3张图片

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

如何在Android上开始使用推送通知_第4张图片

现在,点击Cloud Messaging按钮,然后点击Enable Google Cloud Messaging 几秒钟后,将显示服务器API密钥和发件人ID。 记下服务器API密钥,然后按Close

如何在Android上开始使用推送通知_第5张图片

我们之前添加的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_topictopic 它只需要两行代码。 首先,使用其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方法内部,我们要做的只是简单地通过使用IntentstartService方法启动注册服务来再次启动注册过程。

将以下代码添加到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:启动注册服务

为确保注册过程在应用程序启动后立即开始,我们必须在MainActivityonCreate方法内启动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图标库中获得一个。

如何在Android上开始使用推送通知_第6张图片

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

6.运行Android应用

我们的Android应用现已完成。 编译并在Android设备上运行后,您将能够在logcat日志中看到注册令牌。


按设备上的后退按钮以退出应用程序。 这是必要的,因为GCM仅在用户不使用应用程序时才会自动显示推送通知。 如果您希望即使在应用程序运行时也显示通知,则必须使用Notification.Builder类在NotificationsListenerService自己创建通知。

7.发送推送通知

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

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

步骤1:创建脚本

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

在文件顶部,导入urllib2urllib模块。 我们将使用这些模块将数据发送到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

你可能感兴趣的:(如何在Android上开始使用推送通知)