2014-10-02 33 views
-1

我正在考虑使用GCM,但我不希望设备在未显示应用程序时收到通知。只有当用户在应用程序中时,更新才有用。什么是Android中用于将数据更新通知推送到客户端的最佳系统?仅当应用程序正在运行且处于前景时

我已经看过提供pub sub/push服务的各种服务,其中大部分服务似乎只针对web浏览器。如果可能的话,我想使用GCM,最后的手段我只需要在应用程序运行时每隔几分钟轮询一次Web服务。

该服务将大约每4-6分钟24/7/365发送数据更新通知给那些订阅特定频道的设备。用户希望更新尽可能快,但不要在应用程序关闭时进行。我觉得,如果我只是在用户不在应用程序中时抛弃这些通知,则会不必要地浪费电池和数据。

我当前的策略,除非我使用推策略,当我期望有更新(最后一次更新后5分钟)时,每隔1分钟开始轮询。然后重复。一旦应用程序关闭,投票将停止。

+0

你看过[Parse.com](https://www.parse。COM /文档/ push_guide#选项数据/ Android的)?它们允许您发送没有“alert”字符串的消息,这意味着它不会出现在通知中心,但是[您的应用程序可以根据需要处理消息](https://www.parse.com/docs/push_guide#接收响应/ Android设备)。请注意,他们在引擎盖下使用GCM。 – 2014-10-02 02:09:42

+0

一些用户每周只能在应用中使用10分钟。我不希望每天24小时每4-6分钟向这些设备发送通知。我只想在应用程序处于前台时进行更新。解析只是另一个系统来传递相同的信息,我也在看亚马逊SNS – karlwbloedorn 2014-10-02 02:28:11

+0

一种方法是[使用高级定位](https://www.parse.com/docs/push_guide#sending-queries/REST)和设置当您的应用处于前台时,将“wantMessages”标志设置为“true”。 – 2014-10-02 02:35:27

回答

0

我会把这个问题当作是要求一个模式,而不是一个工具的建议。

一般来说,处理服务器到客户端的通知有很多种方式,不仅仅是在Android中。

当在Android上使用推送通知时,GCM将是首选。为了仅在应用程序处于活动状态时接收通知,应用程序可以使用服务器进行检查,并基本上在有限的时间内订阅通知。服务器将保存每个注册设备的设备ID,并保留最近签入的时间戳。如果发生新事件,服务器会将通知推送给在特定时间段内处于活动状态的所有客户端。 (例如,如果客户端每30分钟检查一次,服务器将传递消息35分钟)。

这里的优势是推送通知可以携带有效负载,因此数据自动到达应用程序。浪费会受到限制,因为在应用程序闲置或退出后不会传递任何消息。

当然,推送通知的重点之一是能够访问不活动的应用程序,这不适用于此。

但是,如果有效负载相对较小并且更新频率较低,则轮询可能是优选的。如果存在通信问题,您几乎可以立即知道,并且您可以在网络可用时立即进行轮询。更新间隔为五分钟时,电池消耗可以忽略不计。

-1

Parse.com提供了工具来做你想做的事情,基本的产品是免费的。 (披露:我不在那里工作 - 我刚刚在内部演示应用程序上使用他们的产品)。

在您的主要活动,例如,你可以添加:

@Override 
public void onPause() { 
    super.onPause(); 
    ParseUser user = /* however you want to log in, etc */; 

    user.put("wantMessages", "no"); 
} 
@Override 
public void onResume() { 
    super.onResume(); 
    ParseUser user = /* however you want to log in, etc */; 

    user.put("wantMessages", "yes"); 
} 

现在你可以send messages from your server像这样:

curl -X PUT \ 
    -H "X-Parse-Application-Id: XWMoibK5LL86NsU2GIy02ozXx2YiggG4kJL9q4Eg" \ 
    -H "X-Parse-REST-API-Key: yIIdNdZRSuZxeKpa7a1CyjxrAORMJ5mtcC4BQdE1" \ 
    -H "Content-Type: application/json" \ 
    -d '{ 
     "where": { 
      "wantMessages": "yes" 
     }, 
     "data": { 
      "new-data-url": "https://download.from.here/data.txt" 
     } 
     }' \ 
    https://api.parse.com/1/push 

因此,只有在前台应用程序的用户将获得消息。

+0

是wantMessages服务器端还是客户端标志?消息是否被发送并被忽略? – karlwbloedorn 2014-10-02 03:04:45

+0

该标志被保存在Parse数据库中的服务器端,并且不会发送消息。 – 2014-10-02 03:09:12

相关问题