Android 应用程序快速开发简介

LeanCloud 通讯 2014-08-22 03:31:40
加精
via:AVOS Cloud

AVOS Cloud 移动开发 SDK 为 iOS、Android 和 WindowsPhone 应用程序提供了基于云的 API 和服务,并且还提供了 JavaScript 和 REST API。使用 AVOS Cloud API,您可以极快地以最少工作量让您的移动应用程序支持云处理。集成了 AVOS Cloud SDK 的移动应用程序可以轻松地在 AVOS Cloud 云上存储数据对象和文件,发送并侦听推送通知,管理用户,处理地理位置数据,并可以轻松获得移动IM的能力。

开始之前

出于本文的目的,我假设您已经非常熟悉使用 JSON、Android 和 Eclipse 进行移动应用编程的基本概念。在您继续阅读本文之前,请访问 avoscloud.com 并创建您的应用程序。只需遵循注册页面中的简单指令即可。


本文介绍了包含用户、数据对象和文件的核心 API 类。您将学习如何使用访问控制列表 (ACL),以及如何在数据对象上执行 CRUD 操作,还有如何在 AVOS Cloud 云端存储和检索文件。示例均构建于 AVOS Cloud SDK for Android 之上(请参阅 https://cn.avoscloud.com/docs/android_guide.html)。

AVOS Cloud 控制台

AVOS Cloud 控制台可以帮助开发人员管理应用程序。该控制台为 API、文件和推送的通知提供了一般指标和应用程序特定的使用指标。通过控制台可管理应用程序的基本设置信息,它还提供了数据浏览器,使开发人员能够浏览(甚至编辑)所存储的数据对象。数据浏览器对于调试非常有用。图 1 是 AVOS Cloud 控制台的屏幕截图:

图 1. AVOS Cloud 控制台


通过一个 App ID 和 App Key 对应用程序进行身份验证。为了获得您的应用程序 ID 和 Key,必须通过 AVOS Cloud 控制台注册您的应用程序。在您的应用程序上初始化 AVOS Cloud SDK 时,会用到这些信息。

AVObject 数据对象

在 AVOS Cloud 中,使用 “键-值” 对的容器 AVObject 表示数据。AVObject 可以存储任何与 JSON 兼容的数据,如清单 1 所示:

清单 1. AVObject 示例
AVObject myObject = new AVObject("MyObject"); // Class Name
myObject.put("name", “Feng Junwen");
myObject.put("twitterHandle", “jwfing");
myObject.put("followers", 123456);


AVObject 在实例化时被赋予一个 classname(类名称)。在上述代码中,类名称是 "MyObject"。类名称与关系数据库中的表名称相似,同一类的 AVObject 对象相当于表中的行。

AVObject 暴露的方法类似于 Java Map 类中的方法,如 put、get 和 remove,以及大量特定于 AVObject 的其他方法。

AVObject名称键 必须是字母数字的,作为一个指导方针,请对名称键使用驼峰式大小写 (camel-casing) 格式。值可以是存储在 JSON 中的任何数据类型,也就是说,可以是数字、字符串、布尔值、数组、JSONObject.NULL、JSONObject 和 JSONArray。AVObject 所支持的其他数据类型是 Java Date 和 byte[] 数组。AVObject 还可以嵌套包含其他 AVObject。

清单 2 显示了部分受支持的 AVObject 值数据类型:

清单 2. AVObject: 部分支持的值数据类型
// Byte Array
byte[] byteArray = {1, 2, 3, 4, 5};

// A date
Date d = new Date(); // java.util.Date

// A number
int number = 21;

// A String
String name = "Enrique";

// A JSONArray - any mix of JSONObjects, JSONArrays, Strings, Booleans,
// Integers, Longs, Doubles, null or NULL.
JSONArray jArray = new JSONArray();
jArray.put(number);
jArray.put(name);

// A JSONObject
JSONObject jObject = new JSONObject();
try {
jObject.put("number", number);
jObject.put("name", name);
} catch (JSONException e) {
e.printStackTrace();
}

// A AVObject
AVObject pObject = new AVObject("MyObject"); // Class name
pObject.put("myByteArray", byteArray);
pObject.put("myDate", d);
pObject.put("myString", name);
pObject.put("myNumber", number);
pObject.put("myJsonArray", jArray);
pObject.put("myJsonObject", jObject);
pObject.put("myNull", JSONObject.NULL);


上述代码创建了一个 AVObject,它在 AVOS Cloud 云端被存储为一个对象。之后,我们可以保存、查询和更新,并能从云端存储中删除。甚至可以在应用程序离线时保存数据,AVOS Cloud SDK 将数据保存在本地,直到重新建立网络连接。

修改 AVObject

如果您熟悉移动应用程序开发,那么您就会知道,网络操作等长时间操作一般都是在后台完成,或在一个工作线程上完成,而不是在主系统的 UI 线程上完成。这样可以避免主线程发生阻塞并影响用户界面的响应速度。稍后,在本文的后半部分,我会告诉您 AVOS Cloud 如何为后台工作提供便利,从而保存、删除和查找对象。现在,考虑下面的同步 remove() 方法,可以使用它从 AVObject 删除一个字段:
pObject.remove("myNumber"); // remove the field/key "myNumber" from pObject


在删除或添加字段后,或在更新当前字段后,您可以在云端保存(或更新)数据对象,只需调用其中一个 AVObject 的 save...() 方法,我稍后会在本文中讨论它们。

AVOS Cloud 用户、角色和 ACL

在我告诉您如何在 AVOS Cloud 对象上执行 CRUD 操作之前,您应该了解一下 用户、角色和 ACL(访问控制列表)。这三个都是非常重要的概念,有助于保护您的应用程序的数据对象。

用户

名称为 AVUser 的类代表一个用户,并为应用程序提供帐户管理功能。每个应用程序都有与之关联的 AVUser 表。一个 AVUser 也是一个 AVObject,但具有更多的属性,如用户名、密码和电子邮件。您可以添加任何您认为合适的其他数据值。

AVOS Cloud 中的匿名用户

在 AVOS Cloud 中,匿名用户是没有用户名或密码的用户。匿名用户对于那些不要求用户身份验证的移动应用程序功能非常有用。匿名用户可以创建数据对象,但这些对象寿命很短,并且在匿名用户登出之后就不再可用。



用户可以注册成为您应用的 AVUser 用户,如清单 3 所示:
清单 3. AVUser — 注册
AVUser user = new AVUser();
user.setUsername(“Feng Junwen");
user.setPassword(“123456&asdQWE");
user.setEmail(“jfeng@avoscloud.com");
user.put("userType", "Author"); // add another field

// Call the asynchronous background method to sign up
user.signUpInBackground(new SignUpCallback() {
public void done(AVException e) {
if (e == null) {
// Successful. Allow access to app.
} else {
// Failed....
}
}
});


username 和 email 必须是应用内惟一的。如果 username 或 email 已经被使用,那么注册调用将会失败。您应该有一个通知用户字段限制的机制,并提供一个重试的进程。

在注册之后,用户就可以登录您的应用,如清单 4 所示:

清单 4. AVUser — 登录
AVUser.logInInBackground(“Feng Junwen", “123456&asdQWE", new LogInCallback() {
public void done(AVUser user, AVException e) {
if (user != null) {
// Successful. Allow access to app.
} else {
// Failed
}
}
});


您可以通过调用 AVUser.save() 更新用户信息。 但是请注意,只有 AVUser 的所有者可以修改其内容,数据对于其他任何人都是只读的。

AVOS Cloud SDK 会缓存当前登录的用户。您可以通过调用 AVUser.currentUser() 查询当前用户。currentUser 方法使您能够快速访问当前用户信息,那么如果当前用户会话没有激活,您只需要根据提示输入验证。清单 5 显示了如何获取当前用户:

清单 5. AVUser — 获得当前用户
AVUser currentUser = AVUser.getCurrentUser();
if (currentUser != null) {
// current user is valid
} else {
// current user not valid, ask for credentials
}


重置当前用户

在 AVOS Cloud 中,您可以通过调用 AVUser.logOut() 来重置当前用户,如清单 6 所示:

清单 6. AVUser — 重置当前用户(登出)
AVUser.logOut(); // static method


ACL

ACL 是关联到数据对象的访问权限(或控制)列表。AVACL 类允许您为给定的 AVObject 定义权限。使用 ACL,您可以定义对您的应用程序数据对象的公共访问,并且可以(通过角色)限制对特定用户或用户组的访问。清单 7 演示了 AVOS Cloud ACL 的用法:

清单 7. 使用 AVACL 实现访问权限控制
// Define a AVOS Cloud user
AVUser user = new AVUser();
user.setUsername(username);
:
:

// Define a read/write ACL
AVACL rwACL = new AVACL();
rwACL.setReadAccess(user, true); // allow user to do reads
rwACL.setWriteAccess(user, true); // allow user to do writes
:
:

// Define a AVOS Cloud object and its ACL
AVObject gameObject = new AVObject("Game");
gameObject.setACL(rwACL); // allow user do read/writes on gameObject
gameObject.saveInBackground(); // save the ACL'ed object to the cloud
:
:

// You can define a public ACL that gives public access to the object
AVACL publicACL = new AVACL();
publicACL.setPublicReadAccess(true);
publicACL.setPublicWriteAccess(true);
gameObject.setACL(publicACL); // allow public read/writes
gameObject.saveInBackground(); // save the ACL'ed object to the cloud


您还可以为所有新创建的对象定义一个默认的 ACL。在清单 8 中,我已经将可读取和写入的默认 ACL 设置为 public,清单 7 中的 publicACL定义。

清单 8. 设置默认的 ACL
// Set a default ACL for all newly created objects as public access
AVACL.setDefaultACL(publicACL, true);


虽然在这里没有演示,但我们也可以使用 AVRole 类为用户组授予访问权限。

接下来,我们将查看如何将 AVObject 数据对象保存到 AVOS Cloud 云,并在云端检索它们。

保存 AVObject 数据对象

一旦创建并填充了 AVObject,就可以在 AVOS Cloud 云上保存。在云端保存数据对象实际上是利用 AVOS Cloud 最简单的操作之一,其复杂性通常与数据表示、编组、网络通信和传输等有关联,AVOS Cloud SDK 完全隐藏了此复杂性。您需要使用 helper 方法来将数据对象实例映射到 AVObject,并映射回来,您需要决定是在您自己的线程上调度 AVOS Cloud 保存操作,还是使用 save-in-the-background 方法。

谨防系统线程阻塞!

回想一下,在移动应用程序中,长时间的操作(如网络、文件或长的计算)不应该在主系统线程上完成。相反,应在一个单独的工作线程中执行它们。阻塞系统线程会对应用程序的用户界面的响应能力产生负面影响,有可能导致强行关闭您的应用程序。


AVObject 提供两个保存方法: save() 和 saveInBackground()。 saveInBackground()是建议的保存方法,因为它在自己的工作线程上运行保存操作。如果您选择使用同步的save() 方法,需要注意的是,您需要在该方法自己的工作线程上调用该方法,以避免 UI 被阻塞。

清单 9 显示的代码在后台保存 AVObject 数据对象:

清单 9. 在后台保存 AVObject
// AVObject
AVObject pObject = new AVObject("ExampleObject");
pObject.put("myNumber", number);
pObject.put("myString", name);
pObject.saveInBackground(); // asynchronous, no callback


清单 10 显示的代码使用了一个回调,在后台保存 AVObject 数据对象:

清单 10. 使用回调,在后台保存
pObject.saveInBackground(new SaveCallback () {
@Override
public void done(AVException ex) {
if (ex == null) {
isSaved = true;
} else {
// Failed
isSaved = false;
}
}
});


save...() 方法的变形包括以下几种:

·使用或不使用回调,saveAllinBackground() 保存 AVObject。
·saveAll(List<AVObject> objects) 保存 AVObjects 的列表。
·saveAllinBackground(List<AVObject> objects) 在后台保存 AVObjects 的列表。
·saveEventually() 让您能够在未来某个时点将数据对象保存到服务器;如果 AVOS Cloud 云目前不可访问,则使用该方法。

一旦在云上已成功保存了 AVObject ,就会为对象提供惟一的 Object-ID。此 Object-ID 非常重要,因为它惟一地标识了此 AVObject 实例。例如,您可以使用 Object-ID 确定是否已在云上成功保存该对象,以便检索或刷新给定的对象实例和删除特定的 AVObject。

检索数据对象

这一节将探讨查询和检索 AVOS Cloud 云上的数据对象的方法。您可以通过 object-ID 查询一个 AVObject,您也可以使用属性查询一个或多个 AVObject 对象。如果您已经有一个 AVObject,那么您可以通过从服务器提取最新的值,刷新或同步其内容。我们将在以下代码片段中探讨所有这些选项。

提取 AVObjects

为了从 AVOS Cloud 云提取数据对象,使用 AVObject 方法 fetch() 或 fetchInBackground(),如清单 11 所示:

阅读全文请转到:http://blog.segmentfault.com/jwfing/1190000000636086

...全文
2909 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
JokerJQK 2017-05-07
  • 打赏
  • 举报
回复
博主,请问下,当我在注册的时候,报错 password is missing or empty ,这是为什么呢?
梦_影 2014-09-04
  • 打赏
  • 举报
回复
学习中,先收藏
  • 打赏
  • 举报
回复
收藏学习中。
Sidyhe 2014-08-28
  • 打赏
  • 举报
回复
「已注销」 2014-08-26
  • 打赏
  • 举报
回复
厉害,学习了学习了!
qq_20079935 2014-08-26
  • 打赏
  • 举报
回复
嗯嗯 亲一个
云满笔记 2014-08-25
  • 打赏
  • 举报
回复
安卓开发 支持支持
king_999999 2014-08-25
  • 打赏
  • 举报
回复
写的很好,学习啦!
oliverwangzhiyuan 2014-08-25
  • 打赏
  • 举报
回复
仅仅是配置平台就花了好久
WFL812 2014-08-24
  • 打赏
  • 举报
回复
不错 路过 学习了
nettman 2014-08-24
  • 打赏
  • 举报
回复
收藏下
jerry664991570 2014-08-24
  • 打赏
  • 举报
回复
非常不错值得学习
gotodsp 2014-08-23
  • 打赏
  • 举报
回复
谢谢楼主,学习啦!
laoer_2002 2014-08-23
  • 打赏
  • 举报
回复
学习,谢谢楼主分享
jie19861002 2014-08-23
  • 打赏
  • 举报
回复
谢谢分享,感觉楼主
qq_19961139 2014-08-23
  • 打赏
  • 举报
回复
你们都是牛人
majian1309 2014-08-22
  • 打赏
  • 举报
回复
谢谢~ 好的 还有几篇不错的技术文章 麻烦看一下吧~
qq_18809557 2014-08-22
  • 打赏
  • 举报
回复
这么专业,不知道什么时候能接近这么程度 h,,
tldeyh 2014-08-22
  • 打赏
  • 举报
回复
写的很好。值的一看
qq_19373173 2014-08-22
  • 打赏
  • 举报
回复
为 iOS、Android 和 WindowsPhone 应用程序提供了基于云的 API 和服务,并且还提供了 JavaScript 和 REST API。
加载更多回复(17)

80,337

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧