使用 MobileData 云服务构建一个 Android 应用程序

2014 年 2 月 20 日
PDF (632 KB)
 

使用 MobileData 云服务构建一个 Android 应用程序

11:21  |  抄本
author photo - belinda johnson

Belinda Johnson

Software Engineer, IBM Mobile Cloud Services

@BeeMarieJohnson

author photo - nick gibson

Nick Gibson

Software Engineer, IBM Mobile Cloud Services

@ndgibs on Twitter
Follow me on Google+

author photo - andrew huffman

Andrew Huffman

Software Engineer, IBM Mobile Cloud Services

 

Codename: BlueMix 是一款 beta 级产品,随着我们不断让其功能更加完善和更易于使用,它也将不断改进。我们会竭尽全力保持本文最新,但并不总是完全跟得上现状。感谢大家的理解!

您可能已经了解 Codename:BlueMix 的一些好处,它是 IBM 用于开发和部署移动应用程序和 Web 应用程序的开放式平台。BlueMix 中的许多预构建服务使得开发人员可以轻松地构建和增强应用程序。在本文中,我们将介绍使用 MobileData 服务构建一个 Android 应用程序的步骤。

您有没有遇到过这样的场景:等您走到杂货店后才发现自己忘记了妻子那个美味的蛋奶酥配方所需的确切配料?或者忘记孩子们所要求的第二天的午餐盒甜品?如果他们可以将自己的要求输入到一个共享的购物清单中,而且您可以收到有关更新的推送通知,情况又会怎样呢?

进入 BlueList 应用程序。这个简单的应用程序使用了 BlueMix 服务,让您可以立刻开始编写自己(更复杂)的应用程序。本文将告诉您如何从一个 Android 应用程序开始,并添加 MobileData 服务来存储、删除、更新和查询存储在云中的对象。(后续文章将会告诉您如何将 Push 和 CloudCode 服务添加到您的应用程序中,这样您就可以在列表获得更新时收到通知,并在其中一台设备以某种方式更新列表时,让所有设备上的列表都可以获得刷新。)

这个简单的应用程序使用 BlueMix 服务,让您可以立刻开始编写自己(更复杂)的应用程序。

v0 是 BlueList 应用程序的基础版本。 我们会告诉您如何添加 MobileData 服务,让您的代码将看起来类似 v1 代码。 您可以从 v0 开始,逐个完成这些步骤,或跳过这些步骤,直接下载 v1。v1 版本的 BlueList 应用程序包括 MobileData 服务。

构建该应用程序的先决条件

 
  • 熟悉 Android 开发
  • 一个 Android 开发环境。我们使用的是 Eclipse with ADT,但您可以随意使用自己喜爱的工具。
  • 来自 JazzHub 的 v0 代码(单击上面的按钮)。在您的模拟器中运行此代码。重新启动应用程序,请注意,列表项不是永久性的。本文中的步骤将会向您展示如何将 MobileData 服务添加到您的应用程序中,从而使列表项持续存在。
  • 一个 Codename:BlueMix ID(加入 beta!),这样您就可以获得 MobileData 服务。

步骤 1. 在 BlueMix 上创建一个 Mobile App Services bundle

 
  1. 登录到 BlueMix
  2. 单击 Add an application 转到目录。添加一个应用程序按钮的屏幕截图
  3. 单击 Boilerplates 下面的 Mobile Backend StarterMobile App Services bundle 的屏幕截图

    点击查看大图

  4. 单击 Create ApplicationMobile Backend Starter 的屏幕截图,含创建应用程序按钮
  5. 填写 "Create application" 面板,然后单击 Create应用创建面板的屏幕截图
  6. 在创建应用程序后,它会出现在仪表板中。单击新的应用程序,访问其 Overview 页面。在 Catalog 中的 Application 屏幕截图

    点击查看大图

  7. 您会看到新应用程序的 Overview 页面。到达该页面后,单击 Download Android SDK
    IBM SDK for Android 按钮的屏幕截图

    备注: 在步骤 9 中将会需要此页上的 API Key。

  8. 解压刚才下载的 SDK,并将所需的 jar (ibmcore.jar 和 ibmdata.jar) 复制到您的 v0 项目的 libs 文件夹中。进入项目的 jar 文件的屏幕截图
  9. 编辑您的项目的 assets 文件夹中的 configuration.json 文件。
    {
    	applicationID:"<INSERT_APPLICATION_ID_HERE>"
    }
  10. 将 API Key 从您的应用程序的 Overview 页面(在 BlueMix 上)复制到 configuration.json。(如需进入 Overview 页面,请登录到 BlueMix,转到您的仪表板,然后单击所需的应用程序。)

步骤 2. 添加基本权限

 
  1. 您的 Andr​​oid 应用程序需要一些基本的网络功能和权限,所以我们在清单文件中包含了以下权限。打开 AndroidManifest.xml 文件来看一下。
    <uses-permission 
        android:name="android.permission.INTERNET" />
    <uses-permission 
        android:name="android.permission.WAKE_LOCK" />
    <uses-permission 
        android:name="android.permission.GET_ACCOUNTS" />
    <uses-permission 
        android:name="android.permission.USE_CREDENTIALS" />
    <uses-permission 
        android:name="android.permission.ACCESS_WIFI_STATE" />

步骤 3. 编辑 BlueListApplication,以初始化 SDK 并在 MobileData 服务中注册 Item 规范

 
  1. 在创建活动时,使用 Android 的 registerActivityLifecycleCallbacks 来初始化 SDK。通过初始化 SDK 来编辑 onActivityCreated 方法,如下所示。
    registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
    	public void onActivityCreated(Activity activity,Bundle savedInstanceState) {
    		Log.d(CLASS_NAME, "Activity created:" + activity.getLocalClassName());
    		//Initialize the SDK
    		IBMBaaS.initializeSDK(activity);
    	}
  2. 在创建应用程序时注册 Item Specialization。这将在 BlueListApplication 的 onCreate 方法中完成,如下列清单所示:
    public void onCreate() {
    	super.onCreate();
    	itemList = new ArrayList<Item>();
        Item.registerSpecialization(Item.class);
    }
  3. 在执行操作时不要忘了使用 Eclipse 来组织导入 (Ctrl+Shift+O)。Eclipse 会自动从前面复制到项目中的 SDK jar 文件导入所有必要元素。此时,您可能仍会看到一些错误,但本教程后面的步骤将会解决这些问题。

步骤 4. 编辑 Item 类,以便使用 MobileData 服务

 
  1. 通过扩展 MobileData 的 IBMDataObject 并将此类注释为一个 IBMDataObjectSpecialization 来集成 MobileData 服务。一定要添加一个 NAME 字符串,稍后会将它用作访问对象的键。
    @IBMDataObjectSpecialization("Item")
    public class Item extends IBMDataObject {
    	public static final String CLASS_NAME = "Item";
    	private static final String NAME = "name";
  2. 编辑 getName()setName() 方法,以便使用 MobileData 服务提供的 getObjectsetObject 方法。通过一个键来引用与对象关联的值。您可以使用 setObject(<key>, <value>) 来设置值,并使用 getObject(<key>) 检索它们。
    public String getName() {
    	return (String) getObject(NAME);
    }
    public void setName(String itemName) {
    	setObject(NAME, (itemName != null) ? itemName :"");
    }
  3. 删除 Item 构造函数,因为不再需要它了。
  4. 再一次组织您的导入!

步骤 5. 在 MainActivity 类中,使用 MobileData 在云中创建、读取和删除数据。

 
  1. 实现 listItems 方法,从 MobileData 读取一些数据项。我们将以不区分大小写的字母顺序对这些数据项进行排序。将 listItems 创建为 Main Activity 类的一个方法。
    public void listItems() {
    	try {
    		IBMQuery<Item> query = IBMQuery.queryForClass(Item.class);
    		query.findObjectsInBackground(new IBMQueryResult<Item>() {
    			public void onResult(final List<Item> objects) {
    				if (!isFinishing()) {
    					runOnUiThread(new Runnable() {
    						public void run() {
    							//clear local itemList, as we'll be 
                                //repopulating & reordering from MobileData.
    							itemList.clear();
    							for(IBMDataObject item:objects) {
    								itemList.add((Item) item);
    							}
    							sortItems(itemList);
    							lvArrayAdapter.notifyDataSetChanged();
    						}
    					});
    				}
    			}
    			public void onError(IBMDataException error) {
    				Log.e(CLASS_NAME, "Exception :" + error.getMessage());
    			}
    		}); 
    	}  catch (IBMDataException error) {
    		Log.e(CLASS_NAME, "Exception :" + error.getMessage());
    	}
    }
  2. 在 onCreate 方法中设置 ArrayAdapter 后,调用 listItems(),将已使用 MobileData 存储的数据项填充到列表中。
    itemsLV.setAdapter(lvArrayAdapter);
    listItems();
  3. 修改 createItem 方法,以便利用 MobileData 的 saveInBackground 创建新的数据项。实现 onResultonError 方法。
    public void createItem(View v) {
    	EditText itemToAdd = (EditText) findViewById(R.id.itemToAdd);
    	String toAdd = itemToAdd.getText().toString();
    	Item item = new Item();
    	if (!toAdd.equals("")) {
    		item.setName(toAdd);
    		item.saveInBackground(new IBMObjectResult<Item>() {
    			public void onResult(Item object) {
    				if (!isFinishing()) {
    					listItems();
    				}
    			}
    			public void onError(IBMDataException error) {
    				Log.e(CLASS_NAME, "Exception :" + error.getMessage());
    			}
    		});
    		//set text field back to empty after item added
    		itemToAdd.setText("");
    	}
    }
  4. deleteItem 方法稍作修改。它现在会使用 MobileData 的 deleteInBackground 方法。实现 onResultonError
    public void deleteItem(Item item) {
    	itemList.remove(listItemPosition);
    	//This will attempt to delete the item on the server
    	item.deleteInBackground(new IBMObjectResult<Item>() {
    		//Called if the object was successfully deleted
    		public void onResult(Item item) {
    			if (!isFinishing()) {
    				runOnUiThread(new Runnable() {
    					public void run() {
    						lvArrayAdapter.notifyDataSetChanged();
    					}
    				});
    			}
    		}
    		//Called if there was an error deleting the item
    		public void onError(IBMDataException error) {
    			Log.e(CLASS_NAME, "Exception :" + error.getMessage());
    			//add error handling here.
    		}
    	});
    	lvArrayAdapter.notifyDataSetChanged();
    }

步骤 6. 在 EditActivity 类中,使用 MobileData 服务更新在云上的数据

 
  1. finishedEdit 方法将调用 MobileData 的 saveInBackground。实现 onResultonError
    public void finishedEdit(View v) {
    	Item item = itemList.get(location);
    	EditText itemToEdit = (EditText) findViewById(R.id.itemToEdit);
    	String text = itemToEdit.getText().toString();
    	item.setName(text);
    	item.saveInBackground(new IBMObjectResult<Item>() {
    		public void onResult(Item object) {
    			if (!isFinishing()) {
    				runOnUiThread(new Runnable() {
    					public void run() {
    						Intent returnIntent = new Intent();
    						setResult(BlueListApplication.EDIT_ACTIVITY_RC, 
                              returnIntent);
    						finish();
    					}
    				});
    			}
    		}
    		public void onError(IBMDataException error) {
    			Log.e(CLASS_NAME, "Exception :" + error.getMessage());
    		}
    	});
    }

步骤 7. 运行应用程序

 
  1. 现在,您已经完成了所有代码修改,您的代码应该等同于版本 1,而且列表项应该是持久性的!
  2. 在模拟器中(Nexus 7 或 Galaxy Nexus 都可以正常运行),或在您的设备上运行最新的代码。单击 Run > Run As > Android Application
     BlueList 应用程序的第一个页面的屏幕截图
  3. 添加一些杂货列表项。
     
    添加一些杂货列表项的屏幕截图添加一些杂货列表项的屏幕截图
  4. 重新启动该应用程序。
  5. 请注意,您的数据项仍然存在。您现在拥有云上的数据!

步骤 8. 查看云中的数据

 
  1. 登录到 BlueMix 。
  2. 在 Dashboard 视图中单击您的应用程序。
  3. 单击 MobileData Service。
  4. 此 Data Viewer 页面了显示已存储在云中的 Data Classes,以及被保存的每个 Data Class 的实例。数据浏览器的屏幕截图

    点击查看大图

结束语

 

使用 Codename:BlueMix 中提供的 MobileData 服务来开发这个应用程序,这会让您感觉到利用移动云服务来使用和集成移动数据功能是多么容易!


相关主题:本系列中的第二篇文章

添加评论

注意:评论中不支持 HTML 语法


剩余 1000 字符

developerWorks: 登录

标有星(*)号的字段是必填字段。


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件

 


在您首次登录 developerWorks 时,会为您创建一份个人概要。您的个人概要中的信息(您的姓名、国家/地区,以及公司名称)是公开显示的,而且会随着您发布的任何内容一起显示,除非您选择隐藏您的公司名称。您可以随时更新您的 IBM 帐户。

所有提交的信息确保安全。

选择您的昵称



当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

标有星(*)号的字段是必填字段。

(昵称长度在 3 至 31 个字符之间)

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

 


所有提交的信息确保安全。

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=移动开发, Cloud computing
ArticleID=971899
ArticleTitle=使用 MobileData 云服务构建一个 Android 应用程序
publish-date=02202014