搭建雲服務器

        雲系統的出現,讓我們的整個生活都發生了巨大的改變,在Android的世界裏也不例外。本章就向讀者介紹一個在雲端的服務器,讓移動開發能夠方便的去通過實現移動端的後端服務。

1.移動後端服務介紹

        隨着雲這個概念不斷深入我們的生活各個方面,現在不管什麼東西,不帶點雲都不好意思出門了。作爲時間簡短前沿的移動平臺,Android自然時趕上時代潮流,將雲帶入了Android的各個方面,其中“移動後端即服務”就是一個典型的例子。

        移動後端即服務——Backend as a Service也叫Baas。說白了,Baas就是幫我們把服務器端的東西全部打包了,做移動端的人不用再考慮如何寫服務器、如何設計數據庫、搭建服務器等,它把這一切都放在了雲端,用戶只需要調用API接口,就可以實現網絡功能。曾經有多少開發者,立志於做一個優秀的App,但是移動端好說,畢竟是幹這一行的,但對於開發服務端,很多移動開發者就不是很精通了,特別是還要租服務器、買域名、管理網站做推廣等,這些就讓很多開發者望而卻步了。但現在有了Baas爲我們提供強大的後端支持,移動開發這就可以將大部分經理放在App本身上,不得不說,這的確是一個非常好的服務。

        Bass的概念最早來源於國外的一些網站,比較老牌的有StackMob和Parse。後來Baas便如雨後春筍一般發展壯大起來,Amazon、Kinvey等都先後加入了Bass的舞臺。當然國內的Bass發展也非常迅速,除了再中國最早做Bass的Bmob以外,還有原子雲、AVOS Cloud、百度frontia、華爲PowerApp等,大家都在分析Baas這一新興概念的“蛋糕”。

        通常Bass平臺會爲開發者提供一系列的雲端服務,一般包括數據存儲、消息推送、文件服務、API分析、應用統計、移動官網等。不同的Bass提供的服務各有不同,也各有側重點。下面2圖展示了兩家不錯的Baas服務提供商。


2.使用Bmob創建移動後端服務

        瞭解了Bass的強大優勢,下面我們以Bmob爲例來講解如何利用Baas再雲端搭建移動平臺的服務器端。

        首先來看看Bmob的官網——https://www.bmob.cn/ 。

        Bmob官網商已經有了比較詳細的開發配置文檔和API文檔,不過我們還是來實際操作一下會比較好。

        

        進入網站選擇創建應用,創建好後,系統就會生成三個唯一的KEY。這些KEY就是APP的身份證。

        點擊創建好的應用。如下圖

        進入應用之後點擊設置即可看到Appid。

       接下來使用AS配置下Gradle和Mainifest。

  • 在Project的build.gradle文件中添加Bmob的maven倉庫地址,示例如下:(注意文字說明部分)。
buildscript {
    
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.0.1'
        

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()
        //Bmob的maven倉庫地址,必須填寫
        maven { url "https://raw.github.com/bmob/bmob-android-sdk/master" }
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}
  • 打開app下的build.gradle文件,添加compile ‘cn.bmob.android:bmob-sdk:3.5.9’——注意Bmop版本號可以去官網查看下最新的版本號
dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'
    compile "cn.bmob.android:bmob-sdk:3.5.9"
}
  • 最後需要修改項目的配置文件。再Mainifest文件中增加一些Bmob所需要用到的權限,代碼如下所示。

    注意:在這裏說一下我爲什麼不下載SDK,放到libs文件夾中,如果使用這種方法,在運行時會報初始化錯誤

    Java.lang.UnsatisfiedLinkError: No implementation found for boolean cn.bmob.v3.helper.BmobNative.init(android.content.Context, java.lang.String) (tried Java_cn_bmob_v3_helper_BmobNative_init and Java_cn_bmob_v3_helper_BmobNative_init__Landroid_content_Context_2Ljava_lang_String_2)。。。。。

    <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_LOGS"/>


        這些再Bmob開發文檔快速入門中都有列舉。接下來,在應用的主入口中調用如下代碼。

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

        這裏的Application ID就是前面創建應用時生成的Key。通過這樣一句簡單的代碼,就完成了整個Bmob項目的準備工作。下面以一個提交反饋的小李子來看看Bmob的數據存儲功能。

2.1 數據服務

        要使用Bmob的數據服務,首先需要創建一個BmonObject對象。在Bmob中,BmonObjec就相當於數據庫中的一張表,每個屬性就相當於表的字段,而每一個BmonObjec對象自然就相當於表裏的一行數據,這點與很多的Web的數據持久化框架差不多,都是通過面向對象的方式來操縱數據。爲了簡單,我們設計了兩個基本的屬性,並給它們提供了get/set方法,代碼如下所示。

public class Feedback extends BmobObject {
    private String name;
    private String feedback;

    public String getName() {
        return name;
    }

    public String getFeedback() {
        return feedback;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setFeedback(String feedback) {
        this.feedback = feedback;
    }
}

        通過調用BmobObject的save方法,就可以將一個BmobObject對象,保存到雲服務器中,同時產生一個回調方法,通過回調來獲取到save成功與失敗的狀態,並進行相應的操作。

        查詢操作也基本類似,先來看一個查詢所有數據的操作,代碼如下所示。

        Feedback feedbackObj = new Feedback();
        feedbackObj.setName(name);
        feedbackObj.setFeedback(feedback);
        feedbackObj.save(new SaveListener<String>() {
            @Override
            public void done(String s, BmobException e) {
                if(e == null) {
                    Toast.makeText(MainActivity.this, "註冊成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(MainActivity.this, e.getErrorCode()+ ":" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });

        通過調用BmobObject的save方法,就可以將一個BmobObject對象,保存到雲端服務器中,同時產生一個回調方法,通過回調來獲取到save成功與失敗的狀態,並進行相應的操作。

        查詢操作也基本類似,先來看一個查詢所有的數據的操作,代碼如下所示。

        BmobQuery<Feedback> query = new BmobQuery<>();
        query.findObjects(new FindListener<Feedback>() {
            @Override
            public void done(List<Feedback> list, BmobException e) {
                if(e == null) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("Query");
                    String str = "";
                    for(Feedback feedback:list) {
                        str += feedback.getName() + ":" + feedback.getFeedback()+"\n";
                    }

                    builder.setMessage(str);
                    builder.create().show();
                } else {
                    Toast.makeText(MainActivity.this, e.getErrorCode()+ ":" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });

        通過BmobQuery,創建一個查詢對象,並使用findObjects方法來獲取數據,與save方法方法一樣,成功與失敗可以做相應的操作。

        此外,如果你要查詢條件下的數據也非常簡單,上面的操作就好比SQL中的Select * from table_feedback,那麼就像在SQL中增加Where條件一樣,代碼如下所示。

        BmobQuery<Feedback> query = new BmobQuery<>();
        query.addWhereEqualTo("name", name);
        query.findObjects(new FindListener<Feedback>() {
            @Override
            public void done(List<Feedback> list, BmobException e) {
                if(e == null) {
                    AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this);
                    builder.setTitle("Query");
                    String str = "";
                    for(Feedback feedback:list) {
                        str += feedback.getName() + ":" + feedback.getFeedback()+"\n";
                    }

                    builder.setMessage(str);
                    builder.create().show();
                } else {
                    Toast.makeText(MainActivity.this, e.getErrorCode()+ ":" + e.getMessage(), Toast.LENGTH_SHORT).show();
                }
            }
        });


        通過addWhereEqualTo等各種方法,就相當於我們給SQL語句增加了Where等條件語句一樣,Bmob所支持的條件查詢語句圖下圖所示。

       


2.2 推送服務

        除了提供數據服務這一基本功能外,Bmop的推送功能也是十分強大的。在前面的基礎上,再來給App增加一個推送的功能。

        首先在Mainifest文件中再增加一些組件的申明,代碼如下所示。

        <!--Bmop推送相關組件-->
        <service
            android:name="cn.bmob.push.lib.service.PushService"
            android:label="PushService"
            android:exported="true"
            android:process=":bmobpush" >
            <intent-filter>
                <action android:name="cn.bmob.push.lib.service.PushService" />
            </intent-filter>
        </service>

        <receiver android:name="cn.bmob.push.PushReceiver" android:process=":bmobpush">
            <intent-filter>
                <!-- 系統啓動完成後會調用 -->
                <action android:name="android.intent.action.BOOT_COMPLETED" />
                <!-- 解鎖完成後會調用 -->
                <action android:name="android.intent.action.USER_PRESENT" />
                <!-- 監聽網絡變化 -->
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
            </intent-filter>
        </receiver>
        <receiver android:name=".PushReceiver" >
            <intent-filter>
                <action android:name="cn.bmob.push.action.MESSAGE" />
            </intent-filter>
        </receiver>

        這裏配置了Bmop SDK中所需要用到的組件。Bmop也是基於長連接的推送服務,因此也會有一個Service來保存推送服務,最後一個receiver則是我們自己定義的receiver,用來獲取實現推送後的操作。

        接下來,與初始化Bmob sdk一樣,也需要再程序的入口處初始化Push服務,代碼如下所示。

        BmobInstallation.getCurrentInstallation().save();
        BmobPush.startWork(this);

        配置好這些以後,服務器的整個推送架構就完成了。只需要在程序中或者Web頁面商發出一條消息,客戶端就可以接收到Push的消息了,代碼如下所示。

      
        BmobPushManager push = new BmobPushManager();        push.pushMessageAll("Test", new PushListener() {            @Override            public void done(BmobException e) {                if(e == null) {                    Toast.makeText(MainActivity.this, "推送成功", Toast.LENGTH_SHORT).show();                } else {
                    Toast.makeText(MainActivity.this, e.getMessage(), Toast.LENGTH_SHORT).show();                }            }        });

        當客戶端收到Push的消息後,通過一下方式來獲取消息,代碼如下所示。

        if(intent.getAction().equals(PushConstants.ACTION_MESSAGE)) {
            String message = intent.getStringExtra(PushConstants.EXTRA_PUSH_MESSAGE_STRING);
        }


        獲取到消息會議Json的格式發送過來,所以可以簡單地解析下Json字符串來獲取消息地文本內容,代碼如下所示。

            Toast.makeText(context, message, Toast.LENGTH_SHORT).show();
            JSONTokener jsonTokener = new JSONTokener(message);
            try {
                JSONObject object = (JSONObject)jsonTokener.nextValue();
                message = object.getString("alert");
            } catch (JSONException e) {
                e.printStackTrace();
            }


        獲取到消息的文本內容後,就可以採取不同的操作了,可以以Toast的形式顯示,也可以記錄在App中,當然最常用的還是以Notification的形式通知出來。

            NotificationManager manager = (NotificationManager)context.getSystemService(Context.NOTIFICATION_SERVICE);
            //設置Notification的相關屬性
            NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
                    .setSmallIcon(R.mipmap.ic_launcher)
                    .setWhen(System.currentTimeMillis())
                    .setContentTitle("test bmop push")
                    .setContentText(message)
                    .setAutoCancel(true);
            manager.notify(1, builder.build());


        當然,Bmob的功能遠不止這麼簡單,以上案例演示了Bmob中最基本也是最常用的幾個小功能,大家可以在它詳細的API文檔中找到更多更復雜的使用方法,如圖所示。




         通過前面的講解,我們大致瞭解瞭如何通過使用移動後端服務來簡化AndroidApp移動端的開發,目前市面上有很多類似的後端服務SDK,這裏雖然只舉了Bmob一個簡單的例子,但是大部分的SDK使用方法基本與之類似,相信讀者通過這個實例,可以掌握到其他後端服務SDK的使用方法了。





















發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章