• 11.2 使用Bmob创建移动后端服务" level="2">11.2 使用Bmob创建移动后端服务
    • 11.2.1 数据服务" level="3">11.2.1 数据服务
    • 11.2.2 推送服务" level="3">11.2.2 推送服务

    11.2 使用Bmob创建移动后端服务" class="reference-link">11.2 使用Bmob创建移动后端服务

    了解了Baas的强大优势,下面我们就以Bmob为例来讲讲如何利用Baas在云端搭建移动平台的服务器端。

    首先来看看Bmob的官网——http://www.bmob.cn/,主页如图11.4所示。

    11.2 使用Bmob创建移动后端服务 - 图1 图11.4 Bmob官网

    Bmob官网上已经有了比较详细的开发配置文档和API文档,不过我们还是来实际操作一下会比较好。

    首先,要下载Bmob的Android SDK,如图11.5所示。

    11.2 使用Bmob创建移动后端服务 - 图2 图11.5 Bmob SDK下载

    下载后就可以将Bmob的lib集成到Android Studio中了。将BmobPush_V0.5beta_1027.jar和BmobSDK_V3.2.6_1103.jar拷贝到工程的lib目录下,然后按F4键选择Module Setting,在Dependencies里面添加刚刚加入的lib,如图11.6所示。

    然后,进入网站后台选择创建应用。创建好后,系统就会生成三个唯一的Key。这些Key就是App的身份证。

    11.2 使用Bmob创建移动后端服务 - 图3 图11.6 引用Bmob Lib库文件

    最后,需要修改项目的配置文件。在Mainifest文件中增加一些Bmob所需要用到的权限,代码如下所示。

    1. <uses-permission android:name="android.permission.INTERNET"/>
    2. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    4. <uses-permission android:name="android.permission.READ_PHONE_STATE"/>
    5. <uses-permission android:name=
    6. "android.permission.WRITE_EXTERNAL_STORAGE"/>
    7. <uses-permission android:name="android.permission.READ_LOGS"/>

    这些在Bmob的开发文档—快速入门中都有列举。接下来,在应用程序的主入口中调用如下代码。

    1. Bmob.initialize(this, "Application ID");

    这里的Application ID就是前面创建应用时生成的Key。通过这样一句简单的代码,就完成了整个Bmob项目的准备工作。下面以一个提交反馈的小例子来看看Bmob最基础的数据存储功能。

    11.2.1 数据服务" class="reference-link">11.2.1 数据服务

    要使用Bmob的数据服务,首先需要创建一个BmobObject对象。在Bmob中,BmobObject就相当于数据库中的一张表,每个属性就相当于表的字段,而每一个BmobObject对象自然就相当于表里的一行数据,这点与很多Web的数据持久化框架差不多,都是通过面向对象的方式来操纵数据。为了简单,这里我们设计了两个基本的属性,并给它们提供了get/set方法,代码如下所示。

    1. package com.imooc.bmob;
    2.  
    3. import cn.bmob.v3.BmobObject;
    4.  
    5. public class Feedback extends BmobObject{
    6.  
    7. private String name;
    8. private String feedback;
    9.  
    10. public String getName() {
    11. return name;
    12. }
    13.  
    14. public void setName(String name) {
    15. this.name = name;
    16. }
    17.  
    18. public String getFeedback() {
    19. return feedback;
    20. }
    21.  
    22. public void setFeedback(String feedback) {
    23. this.feedback = feedback;
    24. }
    25. }

    接下来,就需要创建Feedback对象来保存我们的数据,代码如下所示。

    1. //创建BmobObject对象
    2. Feedback feedbackObj = new Feedback();
    3. feedbackObj.setName(name);
    4. feedbackObj.setFeedback(feedback);
    5. feedbackObj.save(MainActivity.this,new SaveListener() {
    6. @Override
    7. public void onSuccess() {
    8.  
    9. Toast.makeText(
    10. MainActivity.this,
    11. "submit success",
    12. Toast.LENGTH_LONG).show();
    13. }
    14.  
    15. @Override
    16. public void onFailure(int i, String s) {
    17. Toast.makeText(
    18. MainActivity.this,
    19. "submit failure",
    20. Toast.LENGTH_LONG).show();
    21. }
    22. });

    通过调用BmobObject的save方法,就可以将一个BmobObject对象,保存到云端服务器中,同时产生两个回调方法,通过回调来获取到save成功与失败的状态,并进行相应的操作。

    查询操作也基本类似,先来看一个查询所有数据的操作,代码如下所示。

    1. //通过BmobQuery创建一个查询对象
    2. BmobQuery<Feedback> query = new BmobQuery<Feedback>();
    3. query.findObjects(MainActivity.this,new FindListener<Feedback>() {
    4. @Override
    5. public void onSuccess(List<Feedback> feedbacks) {
    6. AlertDialog.Builder builder = new AlertDialog.Builder(
    7. MainActivity.this);
    8. builder.setTitle("Query");
    9. String str = "";
    10. for (Feedback feedback : feedbacks) {
    11. str += feedback.getName() + ":" +
    12. feedback.getFeedback() + "\n";
    13. }
    14. builder.setMessage(str);
    15.  
    16. builder.create().show();
    17. }
    18.  
    19. @Override
    20. public void onError(int i, String s) {
    21.  
    22. }
    23. });

    通过BmobQuery,创建一个查询对象,并使用findObjects方法来获取数据,与save方法一样,成功与失败两个回调方法可以让我们处理相应的操作。

    此外,如果你要查询特定条件下的数据也非常简单,上面的操作就好比SQL中的Select * From Table_Feedback,那么就像在SQL中增加Where条件一样,代码如下所示。

    1. //通过BmobQuery创建一个查询对象
    2. BmobQuery<Feedback> query = new BmobQuery<Feedback>();
    3. //设置查询条件
    4. query.addWhereEqualTo("name", str);
    5. query.findObjects(MainActivity.this,new FindListener<Feedback>() {
    6. @Override
    7. public void onSuccess(List<Feedback> feedbacks) {
    8. AlertDialog.Builder builder = new AlertDialog.Builder(
    9. MainActivity.this);
    10. builder.setTitle("Query");
    11. String str = "";
    12. for (Feedback feedback : feedbacks) {
    13. str += feedback.getName() + ":" +
    14. feedback.getFeedback() + "\n";
    15. }
    16. builder.setMessage(str);
    17. builder.create().show();
    18. }
    19.  
    20. @Override
    21. public void onError(int i, String s) {
    22. }
    23. });

    通过addWhereEqualTo等各种方法,就相当于我们给SQL语句增加了Where等条件语句一样,Bmob所支持的条件查询语句如图11.7所示。

    11.2 使用Bmob创建移动后端服务 - 图4 图11.7 Bmob条件查询语句

    11.2.2 推送服务" class="reference-link">11.2.2 推送服务

    除了提供数据服务这一基本功能外,Bmob的推送功能也是十分强大的。在前面的基础上,再来给App增加一个推送的功能。

    首先,需要在Mainifest文件中再增加一些组件的声明,代码如下所示。

    1. <service
    2. android:label="PushService"
    3. android:name="cn.bmob.push.lib.service.PushService"
    4. android:process="cn.bmob.push"
    5. android:permission="cn.bmob.permission.push"
    6. android:exported="true">
    7. <intent-filter>
    8. <action android:name="cn.bmob.push.lib.service.PushService"/>
    9. </intent-filter>
    10. </service>
    11.  
    12. <receiver android:name="cn.bmob.push.PushReceiver" >
    13. <intent-filter android:priority="2147483647" ><!--优先级加最高-->
    14. <!--系统启动完成后会调用-->
    15. <action android:name="android.intent.action.BOOT_COMPLETED" />
    16. <!--解锁完成后会调用-->
    17. <action android:name="android.intent.action.USER_PRESENT" />
    18. <!--监听网络连通性-->
    19. <action android:name=
    20. "android.net.conn.CONNECTIVITY_CHANGE" />
    21. </intent-filter>
    22. </receiver>
    23.  
    24. <receiver android:name=".PushReceiver">
    25. <intent-filter>
    26. <action android:name="cn.bmob.push.action.MESSAGE"/>
    27. </intent-filter>
    28. </receiver>

    这里配置了Bmob SDK中所需要用到的组件。Bmob也是基于长连接的推送服务,因此也会有一个Service来保存推送服务,最后一个receiver则是我们自己定义的receiver,用来获取实现推送消息后的操作。

    接下来,与初始化Bmob sdk一样,也需要在程序入口处初始化Push服务,代码如下所示。

    1. BmobInstallation.getCurrentInstallation(this).save();
    2. BmobPush.startWork(this, " Application ID ");

    这里同样需要Application ID来作为唯一的身份验证。配置好这些以后,服务器的整个推送架构就完成了。只需要在程序中或者Web页面上发出一条消息,客户端就可以接收到Push的消息了,代码如下所示。

    1. BmobPushManager push = new BmobPushManager(MainActivity.this);
    2. push.pushMessageAll("Test");

    当客户端接收到Push的消息后,通过以下方式来获取消息,代码如下所示。

    1. if (intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
    2. String msg = intent.getStringExtra(
    3. PushConstants.EXTRA_PUSH_MESSAGE_STRING);
    4. }

    获取到的消息会以Json的格式发送过来,所以可以简单地解析一下Json字符串来获取消息的文本内容,代码如下所示。

    1. Toast.makeText(context, msg, Toast.LENGTH_SHORT).show();
    2. JSONTokener jsonTokener = new JSONTokener(msg);
    3. try {
    4. JSONObject object =
    5. (JSONObject) jsonTokener.nextValue();
    6. message = object.getString("alert");
    7. } catch (JSONException e) {
    8. e.printStackTrace();
    9. }

    获取到消息的文本内容后,就可以采取不同的操作了,可以以Toast的形式显示,也可以记录在App中,当然最常用的还是以Notification的形式通知出来。

    1. //获取系统Notification服务
    2. NotificationManager manager = (NotificationManager)
    3. context.getSystemService(Context.NOTIFICATION_SERVICE);
    4. //设置Notification相关属性
    5. Notification notification = new Notification(
    6. R.drawable.ic_launcher,
    7. "TestBmob",
    8. System.currentTimeMillis());
    9. notification.setLatestEventInfo(
    10. context,
    11. "Bmob Test",
    12. message,
    13. null);
    14. manager.notify(R.drawable.ic_launcher, notification);

    当然,Bmob的功能远不止这么简单,以上案例演示了Bmob中最基本也是最常用的几个小功能,大家可以在它详细的API文档中找到更多更复杂的使用方法,如图11.8所示。

    11.2 使用Bmob创建移动后端服务 - 图5 图11.8 Bmob API文档

    通过前面的讲解,我们大致了解了如何通过使用移动后端服务来简化Android App移动端的开发,目前市面上有很多类似的后端服务SDK,这里虽然只举了Bmob一个简单的例子,但是大部分的SDK使用方法都基本与之类似,相信读者通过这个实例,就可以掌握到其他动后端服务SDK的使用方法了。