fbpx
使用Android Studio、Google App Engine建置雲端訊息推撥(二) backend模組與Android

使用Android Studio、Google App Engine建置雲端訊息推撥(二) backend模組與Android

使用Android Studio加入後台backend雲端訊息模組後,在這個專案中即擁有了一個Google App Engine模組,可以在這個環境中測試、開發,最後,只需要一個動作就可以佈署到雲端上,成為一個擁有完整域名的伺服器。首先,我將介紹這個模組自動產生了什麼? 之後在Android專案中實作GCM的規格與類別。

本文章是接續「使用Android Studio、Google App Engine建置雲端訊息推撥(GCM) (一)」,請先自行實作後,再進行本篇內容。

http://litotom.com/2016/06/05/android-gae-gcm-1/

backend模組

backend模組是由Android Studio自動產生的,因為選擇了「App Engine backend Module for Google Cloud Messaging」,針對雲端訊息功能需求也自動產生如下圖的類別:

A6237

RegistrationEndpoint類別

目的是能讓手持裝置可以連上來註冊它的RID,此類別中有三個方法,註冊時呼叫registerDevice方法,而它的對外服務名稱為「register」,如下圖的標示name值:

A6238

RegistrationRecord類別

代表一個註冊資料的類別,其內部只有一個屬性regId。

MessagingEndpoint類別

目的是提供傳送雲端訊息的呼叫介面

OfyService類別

能夠將手持裝置的RID儲存在Google App Engine的Datastore雲端資料庫的類別,使用「Objectify」類別庫達成簡化程式碼的目的

Android專案

GCM的權限設定

自動幫AndroidManifest.xml加入雲端訊息必要的權限

A6243

上圖中的最後兩個個權限的android:name屬性值要修改為

“Package名稱.gcm.permission.C2D_MESSAGE”

專案的gradle

在專案層級的build.gradle(Project:專案名稱)設定檔中,導入Google Play Services類別庫,如下:

dependencies {
    classpath 'com.android.tools.build:gradle:2.0.0'
    classpath 'com.google.gms:google-services:3.0.0'
    // NOTE: Do not place your application dependencies here; they belong
    // in the individual module build.gradle files
}

雲端推播訊息接受器

在AndroidManifest.xml中的application元素內加入

<receiver android:name="com.google.android.gms.gcm.GcmReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND" >
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.tom.stock" />
    </intent-filter>
</receiver>

雲端推播訊息傾聽服務

設計一個新類別,繼承GcmListenerService,如下:

public class MyGcmListenerService extends GcmListenerService {
    @Override
    public void onMessageReceived(String s, Bundle bundle) {
        super.onMessageReceived(s, bundle);
        Log.d("MyGcmListenerService", "From "+s);
        Log.d("MyGcmListenerService", "Message "+
                bundle.getString("message"));
    }
}

並在AndroidManifest.xml中加入service宣告元素

<service android:name=".MyGcmListenerService">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
    </intent-filter>
</service>

設計RegistrationIntentService

建立一個新類別,繼承IntentService,並覆寫onHandleIntent方法:

public class RegistrationIntentService extends IntentService {
    public RegistrationIntentService(){
        super("RegistrationIntentService");
    }
    @Override
    protected void onHandleIntent(Intent intent) {
        InstanceID instanceID = InstanceID.getInstance(this);
        try {
            String token = instanceID.getToken(getString(R.string.gcm_sender_id),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);
            Log.d("MyInstanceID", token);   
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在AndroidManifest.xml中加入service宣告元素

<service
    android:name=".RegistrationIntentService"
    android:exported="false">
</service>

設計InstanceIDListenerService

建立一個新類別,繼承InstanceIDListenerService,並覆寫onTokenRefresh方法:

public class MyInstanceIDListenerService extends InstanceIDListenerService {
    @Override
    public void onTokenRefresh() {
        Intent intent = new Intent(this, RegistrationIntentService.class);
        startService(intent);
    }
}

在AndroidManifest.xml中加入service宣告元素

<service android:name=".MyInstanceIDListenerService">
    <intent-filter>
        <action android:name="com.google.android.gms.iid.InstanceID"/>
    </intent-filter>
</service>

取得Instanct ID

在合適的Activity類別(如MainActivity)的onCreate方法中,以手動方式啟動RegistrationIntentService:

Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);

執行APP後,當RegistrationIntentService啟動後,取得InstanceID的token值,如下圖:

token

上述工作是Google Cloud Messaging的設計,但自從Firebase被Google收購後,2016年的Google IO開發者大會上,Google發表了新版的Firebase,其中最具亮點的一項新功能就是「Firebase Cloud Messaging」雲端訊息,它可以用較快速的方式設計雲端推播訊息,適合較輕量的需求。

唯實務中若要設計客製化,或加入運算、比對、檢查時,還是需要建置自己的伺服器,但仍可將部份工作以Firebase實作,可減少部份的開發成本。

取得Registration Token後呢?

此時,一般開發流程應實作好一個用PHP、Node.js或ASP等的HTTP伺服器端服務,接收Android端傳來的token後儲存在後端資料庫。

幸運的是,使用Google App Engine可以簡化這些複雜的工作,接下來就是Google Cloud Endpoint重頭戲,我們的前端是Android,而後台backend是Google App Engine,它們是「異質」系統,兩個不同的平台。一般來說,後台要設計HTTP服務,訂定參數規格,將規格交給前端的開發人員,而前端可能是Android,也可能是iOS或是Web app。這個繁複的設計、互動工作,沒花掉一兩天,也得要數小時。

在Google App Engine中可以設計Cloud Endpoint,讓這類工作縮少到只要數分鐘就可以完成,包括後台服務介面設計與前端的呼叫程式碼。

相關文章:

Hank Tom

專長為程式語言、雲端服務開發,Linux系統管理, 任職:利拓科技 技術長,海林行動科技 技術總監 輔仁大學 兼任助理教授 , 為 Android高效入門>深度學習、CentOS 7建置、管理與伺服器架設實戰、Java網路程式設計、雲端網頁程式設計-Google App Engine應用實作 等書作者

This Post Has 5 Comments

  1. Avatar

    您好,請問還有後續嗎?

    1. Avatar

      後續因為需要Google App Engine、Google Cloud Endpoint等知識後,才能把整個服務完成,有興趣可以先找一下上述的兩種服務相關知識,應該就能實作出來了。

  2. Avatar

    為何 gcm_sender_id 會出現紅字
    煩請告知 謝謝

    1. Avatar

      那是String resource,建立名稱叫gcm_sender_id的字串,將GCM申請的Sender id填進去

      1. Avatar

        感謝老師的回覆 ,原來要把Sender id 填入
        再次感謝

發佈留言

×
×

Cart