使用安卓的谷歌云信息服务
你可能已经听到了很多关于云计算可以为你做的美妙事情的谈论,你可能很好奇这些服务如何在你的日常生活中发挥作用。如果这听起来像你,那么你需要知道,云服务在我们的生活中正发挥着越来越重要的作用,我们需要看看它们如何改变我们彼此之间的信息。
许多人都把安卓云信息服务看作是未来的一个飞跃,在这里,我们可以与我们关心的人联系,并把这些信息直接保存在云中。千万不要错过与真正对你重要的人沟通的机会,并开始使用云存储来备份你的信息。就这么简单!
你可能听说过c2dm(云到设备消息),它基本上允许第三方应用程序向其安卓应用程序发送(推送)轻量级消息。那么,c2dm这样的功能现在已经被废弃了,取而代之的是它在进化阶梯上的继任者。GCM,即谷歌云信息服务.
GCM是一项(免费)服务,允许开发者从他们的应用服务器推送两种类型的消息到任何数量的在该服务注册的安卓设备上:
-
可折叠的、"发送至同步 "的消息
-
有效载荷最大为4k的非可折叠消息
"可折叠"意味着最近的消息会覆盖以前的消息。send-to-sync "消息用于通知移动应用程序与服务器同步其数据。如果设备在离线一段时间后上线,客户端将只得到最新的服务器消息:
如果你想在你的安卓应用中添加推送通知,入门指南 将一步一步地引导你完成设置过程,甚至为你提供一个由两部分组成的演示应用 (客户端+服务器),你可以直接安装和玩耍。设置过程将为你提供运行GCM所需的两个最基本的信息。
-
您的服务器需要一个API密钥来发送GCM推送通知。
-
客户需要一个发送者ID,以便从服务器接收GCM信息。
以下是使用谷歌API控制台后得到的所有信息的总结。

编写服务器和客户端代码的最快方法是安装样本演示程序,并根据自己的需要进行调整。特别是,你可能想至少做以下任何一项:
-
把演示的内存数据存储改成一个真正的持久性数据存储。
-
改变推送信息的类型和/或内容。
-
将客户端启动时的自动设备注册改为 用户偏好,这样手机用户就可以选择注册/取消注册推送通知。
我们将以最后一个选项为例。从演示结束的地方开始,这里有一个快速的方法来设置 推送偏好 并将其整合到你现有的安卓应用客户端。
在你的android项目-资源 (res/xml) 目录下,创建一个preference.xml文件,比如这个文件:
<?xml version="1.0" encoding="utf-8"?>
<preferencescreen xmlns:android="http://schemas.android.com/apk/res/android" >
<preferencecategory
android:title="push information" >
<edittextpreference
android:key="sname"
android:summary="enter the server name"
android:title="name" />
<edittextpreference
android:key="sip"
android:summary="enter the server ip address"
android:title="ip address" />
<edittextpreference
android:key="sport"
android:summary="enter the server port"
android:title="port" />
<edittextpreference
android:key="sid"
android:summary="enter the sender id"
android:title="sender id" />
</preferencecategory>
<preferencecategory
android:title="push settings" >
<checkboxpreference
android:key="enable"
android:summary="on/off"
android:title="enable server push" />
</preferencecategory>
</preferencescreen>
和相应的活动:
// package here
import android.os.bundle;
import android.preference.preferenceactivity;
public class pushprefsactivity extends preferenceactivity {
@override
protected void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
addpreferencesfromresource(r.xml.preferences);
}
}
以上将提供以下界面:

"启用服务器推送 "复选框是你的android应用程序用户决定注册你的推送信息的地方。然后,只需在你的主活动中使用该偏好类,并进行所需的输入处理。下面的骨架类只显示了你自己的代码添加到预先存在的示例应用程序中。
// package here
import com.google.android.gcm.gcmregistrar;
// other imports here
public class mainactivity extends activity {
/** these two should be static imports from a utilities class*/
public static string server_url;
public static string sender_id;
private boolean push_enabled;
/** called when the activity is first created. */
@override
public void oncreate(bundle savedinstancestate) {
super.oncreate(savedinstancestate);
// other code here...
processpush();
}
/** check push on back button
* if pushprefsactivity is next activity on stack
*/
@override
public void onresume(){
super.onresume();
processpush();
}
/**
* enable user to register/unregister for push notifications
* 1. register user if all fields in prefs are filled and flag is set
* 2. un-register if flag is un-set and user is registered
* */
private void processpush(){
if( checkpushprefs() && push_enabled ){
// register for gcm using the sample app code
}
if(! push_enabled && gcmregistrar.isregisteredonserver(this) ){
gcmregistrar.unregister(this);
}
}
/** check server push preferences */
private boolean checkpushprefs(){
sharedpreferences prefs = preferencemanager
.getdefaultsharedpreferences(this);
string name = prefs.getstring("sname", "");
string ip = prefs.getstring("sip", "");
string port = prefs.getstring("sport", "");
string senderid = prefs.getstring("sid", "");
push_enabled = prefs.getboolean("enable", false);
boolean allfilled = checkallfilled(name, ip, port, senderid);
if( allfilled ){
sender_id = senderid;
server_url = "http://" + ip + ":" + port + "/" + name;
}
return allfilled;
}
/** checks if any number of string fields are filled */
private boolean checkallfilled(string... fields){
for (string field:fields){
if(field == null || field.length() == 0){
return false;
}
}
return true;
}
}
上面的内容几乎是不言自明的。现在,GCM推送通知已被整合到你现有的应用程序中。如果你注册了,在每次服务器推送时,你都会得到一个系统通知消息,即使你的应用程序没有运行。打开该消息会自动打开你的应用程序。
GCM的设置相当简单,因为大部分的管道工作已经为你完成了。附带说明:如果你喜欢把推送功能隔离在自己的子包中,请注意,由样本应用程序提供的、负责处理GCM消息的GCM服务gcmintentservice需要在你的主包中(如设置文档中所示)--否则GCM将无法工作。
当通过HTTP帖子与样本服务器通信时,样本客户端会使用指数回退法进行若干次自动重试,这意味着在失败情况下重试前的等待时间是前一次等待时间的两倍,最高重试次数为5次)。
如果它不适合你,你可能想改变它。不过,这可能没那么重要,因为这些重试是在与主UI线程分开的线程(使用asynctask)中进行的,因此对你的移动应用预先存在的操作流程的影响最小。