Parse 的免費 plan 包含了一百萬個接收者的 push 配額,應該足夠一般 app 使用,而且比起自設 server 發送 push notification 更加方便(不用去 Google Developers Console 開 project)。但 Parse 網站所提供的 Android 的教學有點不清楚,而且都過時。在此分享一下 Android 版的基本 setup。

第一步: 在 Android Studio 按照平時開新 project 的方法來建立一個新的 project。

第二步: 在 module 的 build.gradle 加入 Parse 的 dependency。

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile 'com.android.support:appcompat-v7:23.0.0'
    compile 'com.parse.bolts:bolts-android:1.2.1'
    compile 'com.parse:parse-android:1.10.1'
}

Parse 的教學是下載 JAR 到自己的 project,但其實也可以用 Gradle 來安裝。

不加入 Bolts framework 和 Google Play services 也是可以的,Parse 會檢查設備是否有 Google Play service,如果有的話就會用 Google Cloud Messaging (GCM),沒有的話可以 fallback 到 Parse 自己的 socket connection。

第三步: 建立一個 Application 的 sub-class。在 onCreate 的時候就向 Parse 註冊接收 push notification。

public class MyApplication extends Application {
    private static final String TAG = MyApplication.class.getSimpleName();

    @Override
    public void onCreate() {
        super.onCreate();

        // Enable Local Datastore.
        Parse.enableLocalDatastore(this);

        // Add your initialization code here
        Parse.initialize(this);

        // Subscribe to a channel
        ParsePush.subscribeInBackground("MyChannel", new SaveCallback() {
            @Override
            public void done(ParseException e) {
                if (e == null) {
                    Log.d(TAG, "Successfully subscribed to Parse channel");
                } else {
                    Log.d(TAG, "Failed to subscribe to Parse channel");
                }
            }
        });

        ParseUser.enableAutomaticUser();
        ParseACL defaultACL = new ParseACL();
        // Optionally enable public read access.
        // defaultACL.setPublicReadAccess(true);
        ParseACL.setDefaultACL(defaultACL, true);
    }
}

第四步:strings.xml 加入兩個 <string>,入面的 xxx 是用來放 Parse app 的 App ID 和 Client key。這些 key 可以在 Parse app 的 Settings > Keys 找到。

<string name="parse_app_id">xxxxx</string>
<string name="parse_client_key">xxxxx</string>

第五步: 修改 AndroidMenifest.xml,令 Android app 能接收 Push notification。

<application> 之前,加入權限相關的 tag:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WAKE_LOCK"/>
<uses-permission android:name="android.permission.VIBRATE"/>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>
<uses-permission android:name="android.permission.GET_ACCOUNTS"/>
<uses-permission android:name="com.google.android.c2dm.permission.RECEIVE"/>

<permission
    android:name="your.package.name.permission.C2D_MESSAGE"
    android:protectionLevel="signature"/>
<uses-permission android:name="your.package.name.permission.C2D_MESSAGE"/>

your.package.name 改成 app 的 package name。如果你的 app 只支援有 Google Play service 的設備的話,可以不加 RECfEIVE_BOOT_COMPLETED

<application> 內使用剛才的 Application sub-class:

<application
    android:name=".MyApplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:theme="@style/AppTheme">

<application> 內加入 Parse 的 meta data tag:

<meta-data
    android:name="com.parse.APPLICATION_ID"
    android:value="@string/parse_app_id"/>
<meta-data
    android:name="com.parse.CLIENT_KEY"
    android:value="@string/parse_client_key"/>
<meta-data
    android:name="com.parse.push.notification_icon"
    android:resource="@mipmap/ic_launcher"/>

Notification icon 暫時設成 app icon,你可以再改成其他 icon。

同樣在 <application> 內,加入處理 push notification 的 service 和 receiver:

<service android:name="com.parse.PushService"/>

<receiver android:name="com.parse.ParseBroadcastReceiver">
    <intent-filter>
        <action android:name="android.intent.action.BOOT_COMPLETED"/>
        <action android:name="android.intent.action.USER_PRESENT"/>
    </intent-filter>
</receiver>
<receiver
    android:name="com.parse.ParsePushBroadcastReceiver"
    android:exported="false">
    <intent-filter>
        <action android:name="com.parse.push.intent.RECEIVE"/>
        <action android:name="com.parse.push.intent.DELETE"/>
        <action android:name="com.parse.push.intent.OPEN"/>
    </intent-filter>
</receiver>
<receiver
    android:name="com.parse.GcmBroadcastReceiver"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE"/>
        <action android:name="com.google.android.c2dm.intent.REGISTRATION"/>
        <category android:name="your.package.name"/>
    </intent-filter>
</receiver>

your.package.name 改成 app 的 package name。如果你的 app 只支援有 Google Play service 的設備的話,可以移除帶有 BOOT_COMPLETEDUSER_PRESENT<receiver> tag。

當收到 push notification 的時候,Parse SDK 預設會彈出一個 notification,按一下 notification 會開啟 main activity。如果需要自訂的話可以 override ParsePushBroadcastReceiveronPushReceivedonPushOpenonPushDismissgetNotification

第六步: 在 main activity 的 onCreate 加入 Parse tracker。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ParseAnalytics.trackAppOpenedInBackground(getIntent());
}

第七步: 現在已經完成設定,在設備 run 一次 app,讓它向 Parse 註冊 push notification。然後到 Parse 網站發送一個 push,你的設備應該會收到 push。而且 database 的 Installation class 會有一筆新記錄。