- Android 系统概述
- 什么是智能手机?智能手机操作系统有哪些?
- Android(安卓)是什么?
- Android 系统架构(图解)
- Android 7 新特性介绍
- Android 开发环境搭建
- Android 开发环境搭建教程(图解)
- Android SDK 是什么?
- 通过 Android Studio 创建 Android 应用程序(附带解析)
- Android Studio 的基本调试
- Android 应用程序结构:Android 组件和资源详解
- Android 四大核心组件:Activity+Service+BroadcastReceiver+ContentProvider
- Android Activity 组件及其生命周期
- Android 资源(res 和 assets 目录)
- AndroidManifest.xml 配置文件详解
- Android App Widgets 组件详解
- Android 系统的进程和线程
- Android GUI(图形用户界面)开发
- Android View 和 ViewGroup
- Android 使用 XML 文件定义用户界面
- Android 五大布局:FrameLayout、LinearLayout、AbsoluteLayout、RelativeLayout 和 TableLayout
- Android 创建 Widget 组件实例详解
- Android Button:按钮控件
- Android CheckBox:多选按钮控件
- Android RadioGroup:单选按钮控件
- Android TextView:文本框控件
- Android EditText:编辑框控件
- Android Spinner:下拉列表控件
- Android AutoCompleteTextView:自动完成文本框控件
- Android DatePicker 和 TimePicker:时间日期选择器
- Android ProgressBar:进度条控件
- Android ScrollView:滚动视图
- Android SeekBar:拖动条控件
- Android RatingBar:评价条控件
- Android ImageView 和 ImageButton:图片视图和图片按钮
- Android ImageSwitcher 和 Gallery:图片切换器和图库
- Android GridView:网格视图
- Android Tab:面板标签控件
- Android 菜单:选项菜单+上下文菜单+子菜单
- Android Bitmap(点阵图像、绘制图像)
- Android 对话框(AlertDialog+ProgressDialog)
- Android 多窗口模式(分屏模式)
- Android 事件监听器和回调方法
- Android 电话短信拍照开发教程
- Android Intent:不同应用程序之间通信的桥梁
- Android 实现拨打电话功能
- Android 实现接收短信和发送短信功能
- Android 调用相机进行拍照
- Android 多媒体开发
- Android Service 生命周期和使用方法
- Android BroadcastReceiver:接收广播
- Android 音频以及音频播放器开发实例
- Android MediaRecorder 录制音频
- Android 视频以及视频播放器实例
- Android Camera 相机以及相机程序开发实例
- Android MediaRecorder 录制视频
- Android 数据存储(SQLite 数据库、Android App 数据备份和恢复 )
- Android 数据存储之 SharedPreferences
- Android 数据存储之文件存储
- Android 使用 SQLite 数据库存数数据
- Android SQLite 数据库操作实例
- Android ContentProvider(内容提供者)
- Android 使用系统提供的 ContentProvider
- Android 自定义 ContentProvider
- Android 使用自定义 ContentProvider
- Google App Engine 是什么?
- Android APP 数据备份与恢复
- Android BackupAgent 实现数据备份与恢复
- Android BackupAgentHelper 实现数据备份与恢复
- Android 网络编程
- 借助 GPE 让 Android APP 和 Google App Engine 通信
- Android HTTP 通信
- Android HttpURLConnection 访问互联网资源
- Android 通过 GET 方式获取互联网资源
- Android 通过 POST 方式获取互联网资源
- Android Socket 编程(附带实例)
- Bluetooth(蓝牙)是什么?
- Android 蓝牙通信开发教程(详解版)
- Android 蓝牙通信开发实例演示
- WIFI(无线局域网)是什么?
- Android WiFi 开发(WiFi 编程)实例演示
- WIFI Direct(WIFI 直连)是什么?
- Android WIFI Direct 开发教程
- Android WIFI Direct 开发实例演示
- NFC(近场通信)是什么?
- Android NFC 开发教程
- Android USB 开发简介
- Android USB 附件模式开发教程
- Android USB 主机模式开发教程
- Android SIP 开发教程
- Android 智能传感器
- LBS(位置服务)和 GPS(全球定位系统)简介
- Android LBS 位置服务开发简介
- Android GPS 定位开发教程
- Google Map API 开发简介
- Android Google Map API Key 详细申请步骤
- Google Map API 开发 Android 地图应用实例
- Android 传感器开发教程
- Android 运动传感器开发教程
- Android 位置传感器开发教程
- Android 环境传感器开发教程
- Android 绘图(2D 绘图、3D 绘图)
- Android 2D 绘图开发简介
- Android 使用自定义 View 绘图
- Android 使用 Bitmap 绘图
- Android 使用 SurfaceView 绘制静态图像
- Android 使用 SurfaceView 绘制动态图像
- Android Drawable 开发简介
- Android 3D 绘图开发简介
- Android 硬件加速开发简介
- Android RenderScript 开发简介
- Android App 的国际化和本地化
- Android 国际化和本地化开发简介
- Android 手机区域设置详细步骤
- Android 未本地化应用开发教程
- Android 本地化应用开发教程
- Android 文本输入与复制粘贴
- Android 剪贴板框架开发简介
- Android 剪贴板数据转文本开发简介
- Android 复制粘贴开发教程
- Android Content Provider 复制复杂数据开发教程
- Android 一键复制粘贴开发实例
- Android 企业级应用开发
- Android 设备管理 API 概述
- Android 开发设备管理 API 应用教程
- Android 文本语音 API 开发教程
- Android TV 应用开发教程
- Android TV 应用开发实例
- Android 可穿戴设备应用开发教程
- Android 应用程序的发布
- Android 应用程序发布的步骤
- Android 为什么要为应用程序签名?
- Android 导出未签名应用程序开发步骤
- Android 生成签名文件开发教程
- Android 应用程序签名开发教程
- zipalign 工具优化应用程序开发简介
- Google Play Store( Android Market)发布简介
借助 GPE 让 Android APP 和 Google App Engine 通信
编写将数据同步到云端的应用程序是很难的事情,需要确保很多的细节工作正确。例如服务器端授权、客户端授权、共享的数据模型和 API 等。
幸运的是,开发者不需要自己来完成每一件事,借助于 GPE(Google Plugin for Eclipse)可以大大简化开发的过程。
GPE 是用于管理 Android 设备与 Google App Engine 间对话的管道。
1) 准备环境
安装 GPE 和 GWT SDK。从 https://developers.google.com/eclipse/docs/install-from-zip?hl=zh-CN 页面可以获得安装 GPE 的帮助。安装 GPE 的方法很简单。
单击 Eclipse 界面的 Help | install new software | add | Archive 命令,在弹出的对话框中选择下载的 gpe-e37-latest-updatesite.zip 文件,单击 OK 按钮。如图 1 所示。
图 1 安装 GPE 3.7
在弹出的对话框中选择要安装的组件,并进行安装,如图 2 所示。
图 2 安装 GPE 组件
安装 Java App Engine SDK。从 https://developers.google.com/appengine/downloads?hl=zh-CN#Google_App_Engine_SDK_ for_Java 页面下载 Google App Engine SDK for Java。
解压到硬盘后,在 Eclipse | Windows | Preferences | Google | App Engine | add 界面添加解压目录,Eclipse 会检测到 App Engine SDK 并完成安装。
注册一个 Google 账号,以便于 C2DM(Android Cloud to Device Messaging)功能访问。
C2DM 是 Android 云到设备信息的传递框架,用于从云端发送少量数据到 Android 客户端设备。要获取服务器上不定时更新的信息,一般有两种方法:
- 客户端使用拉(Pull)的方式,隔一段时间就去服务器上获取信息,看是否有更新的信息出现。
- 服务器使用推送(Push)的方式,当服务器端有新信息时,把最新的信息推送到客户端上。
相比之下,推送方法更好一些,不仅可以节省客户端的网络流量,更能够节省电量。
Android 从 2.2 版本开始增加了 C2DM 框架,用于将服务器的信息推送到客户端。
2) 创建工程
当安装好 GPE 后,Eclipse 会出现 App Engine Connected Android Project 工程类型。工程创建向导会提示输入 C2DM 账户信息,这个账户就是在上面注册的新账户。
工程创建完成后,会出现两个项目,一个是 Android 应用程序,另一个是 App Engine 应用程序。
工程向导在这两个项目中创建了示例代码,允许用户通过 AccountManager 来验证 Android 设备与 App Engine 之间的交互。
右击 Android 项目,选择 Debug As | Local App Engine Connected Android Application。这样就能够测试 C2DM 的功能,同时启动一个 App Engine 的本地实例对象,里面包含用户的程序。
3) 创建数据层
上一步创建了能够在 Android 设备与 App Engine 间进行交互的工程,下面修改相关代码实现自己的功能。
首先创建数据层,它定义 Android 设备与 App Engine 之间共享的数据。
打开 App Engine 项目的文件夹,定位到(yourApp)-AppEngine | src |(yourapp)| server。创建一个新的类,该类包含需要存储到云端的数据。示例代码如下:
package com.cloudtasks.server; import javax.persistence.*; @Entity public class Task { private String emailAddress; private String name; private String userId; private String note; @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; public Task() { } public String getEmailAddress() { return emailAddress; } public void setEmailAddress(String emailAddress) { this.emailAddress = emailAddress; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getUserId() { return userId; } public void setUserId(String userId) { this.userId = userId; } public String getNote() { return note; } public void setNote(String note) { this.note = note; } public Long getId() { return id; } public void setId(Long id) { this.id = id; } }
代码中的 @Entity、@Id 与 @GeneratedValue 都来自 Java 持久化 API,这些注释都是必需的。
@Entity 需要被注释在类声明的上面,表明这个类是被定义在数据层的一个实体。
@Id 与 @GeneratedValue 分别表明了实体类的 id 与该 id 形成的规则。在上面的代码中,GenerationType. IDENTITY 表示该实体的 id 是从数据库中生成的。
完成实体数据类的创建后,需要创建 Android 与 App Engine 程序之间交互的方法。这种交互的方法是通过创建一个 Remote Procedure Call(RPC)服务完成的。具体实现的过程相对复杂,但是 GPE 提供了简单的实现方式。
右击 App Engine 项目的源码文件夹,选择 New | Other,再选择 Google | RPC Service,会出现向导,罗列出所有已创建的实体类,单击 Finish 按钮,向导会创建一个 Service 类,它包含对所有实体类的创建、查询、更新和删除(CRUD)操作。
4) 创建持久层
持久层是用于长期存放应用程序数据的地方。根据要存储的数据类型,开发者有几种可选择的实现方法,其中由 Google 管理的可实现持久层的方法为 Google Storage for Developers 和 App Engine 的内建 DataStore。
下面是一个使用 DataStore 实现持久层的示例。
在 com.cloudtasks.server 包下创建一个类用来处理持久层的输入与输出。为了访问这些数据,需要使用 PersistenceManager 类。可以使用在 com.google.android.c2dm.server.PMF 包下的 PMF 类生成这个类的一个实例,然后使用该实例来执行基本的 CRUD 操作:
/** * Remove this object from the data store */ public void delete(Long id){ PersistenceManager pm = PMF.get().getPersistenceManager(); try{ Task item = pm.getObjectById(Task.class,id); pm.deletePersistent(item); }finally{ pm.close(); } }
此外,也可以使用 Query 对象从 Datastore 来检索数据。
public Task find(Long id){ if(id == null){ return null; } PersistenceManager pm = PMF.get().getPersistenceManager(); try{ Query query = pm.newQuery("select from"+Task.class.getName()+"where id =="+id.toString()+"&&emailAddress ==+'"+getUserEmail()+"'"); List list = (List)query.execute(); return list.size() == 0?null:list.get(0); }catch(RuntimeException e){ System.out.println(e); throw e; }finally{ pm.close(); } }
5) 从 Android 应用程序进行查询和更新
为保证 Android 设备与 App Engine 的同步,Android 端应用程序需要完成两件事情:从云端拉取数据和向云端发送数据。这些功能已经由示例代码生成了,开发者需要进行修改以完成自己的功能。
首先,需要将示例代码中的 Activity.java 中的 setHelloWorldScreenContent() 方法删除,用实际的功能代码替换。
然后,交互操作应该在 AsyncTask 类中完成,以避免网络操作导致 UI 线程卡住。
最后,访问云端数据,使用 RequestFactory 来进行操作,该类由 Eclipse plugin 提供。
如果云端数据模型包含一个叫作 Task 的对象,那么这个对象会在生成 RPC layer 的时候自动创建一个 TaskRequest 类对象,以及一个代表单独的 Task 的 TaskProxy 对象。
下面的代码演示了向服务器请求所有 task 的列表的功能。
public void fetchTasks (Long id) { // Request is wrapped in an AsyncTask to avoid making a network request // on the UI thread. new AsyncTask(){ @Override protected List doInBackground (Long... arguments) { final List list=new ArrayList(); MyRequestFactory factory=Util.getRequestFactory (mContext, MyRequestFactory.class) ; TaskRequest taskRequest=factory.taskNinjaRequest(); if (arguments.length==0 || arguments[0]==-1) { factory.taskRequest().queryTasks().fire (new Receiver<list> (){ @Override public void onSuccess (List arg0) { list.addAll (arg0) ; } } }) ; } else { newTask=true; factory.taskRequest().readTask (arguments[0]).fire(new Receiver(){ @Override public void onSuccess(TaskProxy arg0) { list.add(arg0) ; } }); } return list; } @Override protected void onPostExecute (List result) { TaskNinjaActivity.this.dump(result) ; } }.execute (id); } ... public void dump (List tasks) { for (TaskProxy task : tasks) { Log.i ("Task output", task.getName()+"\n"+task.getNote()) ; } }
AsyncTask 类返回了一个 TaskProxy 对象的列表,并且将该列表作为参数发送给了 dump 方法。
为了创建一个新的任务并发送到云端,需要创建一个新的请求对象并使用它来创建一个 proxy 对象。然后通过 proxy 对象执行它的更新方法。
这个过程应该在 AsyncTask 中执行,以避免阻塞 UI 线程。相关代码如下:
new AsyncTask(){ @Override protected Void doInBackground (Void...arg0) { MyRequestFactory factory=(MyRequestFactory)Util.getRequestFactory(TasksActivity.this,MyRequestFactory.class); TaskRequest request=factory.taskRequest(); //Creat your local proxy object,populate it TaskProxy task = request.create(TaskProxy.class); task.setName(taskName); task.setNote(taskDetails); task.setDueDate(dueDate); //To the cloud! request.updateTask(task).fire(); return null; } }.execute();
6) 配置 C2DM 服务器端
为了配置 C2DM 的消息以便能被发送到 Android 设备,我们回到 App Engine 的代码处并打开生成 RPC 层时创建的 Service 类。
如果项目名是 Foo,该 Service 类的名字就叫 FooService。为 Service 每一个方法都添加代码,允许执行增加、删除和更新数据的操作,这样 C2DM 消息才能被发送到用户的设备上。对数据进行更新的相关示例代码如下:
public static Task updateTask (Task task) { task.setEmailAddress (DataStore.getUserEmail ()) ; task=db.update (task) ; DataStore.sendC2DMUpdate (TaskChange.UPDATE+TaskChange.SEPARATOR+task.getId()) return task; } // Helper method. Given a String, send it to the current user's device via C2DM. public static void sendC2DMUpdate (String message) { UserService userService=UserServiceFactory.getUserService(); User user=userService.getCurrentUser(); Servlet Context context=RequestFactoryServlet.getThreadLocalRequest().getSession().getServletContext() SendMessage.sendMessage (context, user.getEmail(), message) ; }
下面的示例代码中创建了一个帮助类 TaskChange。
public class TaskChange{ public static String UPDATE="Update"; public static String DELETE="Delete"; public static String SEPAPATOR=":"; }
该类中创建了一些常量,能够使得 App Engine 与 Android 应用程序之间的交互更加简单。帮助类应该被创建在共享文件夹中。
7) 配置 C2DM 客户端
为了定义当 Android 应用程序接收到 C2DM 的消息时的行为,我们打开 C2DMReceiver 类,找到 onMessage() 方法并根据接收到的消息类型修改这个方法。
//In your C2DMReceiver class public void notifyListener (Intent intent) { if (listener !=null) { Bundle extras=intent.getExtras(); if (extras !=null) { String message= (String) extras.get ("message") ; String[] messages=message.split (Pattern.quote (TaskChange.SEPARATOR)) ; listener.onTaskUpdated (messages[0], Long.parseLong (messages[1])) ; } } } //Elsewhere in your code, wherever it makes sense to perform local updates public void onTasksUpdated (String messageType, Long id) { if (messageType.equals (TaskChange.DELETE)) { // Delete this task from your local data store ... } else { // Call that monstrous Asynctask defined .earlier. fetchTasks (id) ; } }
至此,C2DM 消息触发了本地 Android 设备中信息的更新,同步到云端操作完成。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论