[Android] 使用Parse Push Notification推播服務

為何使用推播服務

會想要研究推播服務(Push Notification),是因為前陣子颱風天,大家都只關心放假的訊息,很多人沒注意到那天台北市不收垃圾,跑去等垃圾車(其中一個是馮光遠),如果可以把這個訊息主動發送給用戶,也許是個不錯的想法,於是我試著把推播服務加入到「台北倒垃圾」

推播服務可作為訊息通知的用途,將重要的訊息主動傳遞給用戶。善用推播服務可以讓你的應用加分,增加應用的使用率,可是濫發推播服務的話,對於用戶反而是一種騷擾,開發者應謹慎使用。

為何選擇Parse平台發送推播服務

Android或iOS都內建有推播服務,但需要整合Google Cloud Message (GCM) 和APNS,幫我們已經整合這兩個平台了,開發者只要使用Parse函式庫,就可以輕易在APP使用推播服務。而且Parse的免費版本,一個月可發送一百萬次的Push Notification。

基本設定

關於Parse Push Notification的設定,網路上有很多版本。我想是因為Parse SDK時常改版,最正確的版本,可以參照Parse官網上的步驟逐步設定:
https://www.parse.com/apps/quickstart#parse_push/android/native/existing

依照官網教學設定完成之後,基本的推播服務就已經可以使用了。

發送推播服務

在測試Parse推播服務之前,Android模擬器要事先安裝Google Apps(如何安裝可參考Genymotion安裝 Google Play的方法一文)。

測試裝置安裝有Parse推播服務的APP之後,回到Parse Dashboard,在「Installation」可以看到已安裝Push Notification Service的裝置,這裡的裝置數僅供參考,因為移除APP之後,這裡的數字不會減少。



要發送測試訊息,可以到「Push」按下「Send a Push」按鈕。

這裡可以選擇發送給所有用戶(Everyone),或是部分用戶(Segment),如果選擇只發送給部分用戶,可以下條件篩選特定對象。


推播訊息可以立即發送,或者設定在特定時間發送,也可以設定訊息的過期時間。

這裡可以撰寫要發送的訊息,訊息格式可以是純文字或 JSON,如果是JSON,格式可以自訂,不過開發者需自行從Custom ParsePushBroadcastReceiver定義接收的訊息,以及這些訊息後續如何應用在APP上。

最後預覽結果,按下「Send now」按鈕,推播訊息就會發送出去。

這是在手機收到的訊息。若覺得樣式不好看,都可以在程式中另行定義。

自訂ParsePushBroadcastReceiver

我們可以新增一個自訂的ParsePushBroadcastReceiver class,並複寫onReceive方法,自行修改在收到推播訊息後,要做哪些處理。

  • 第7~10行是從Push Notification傳回的JSON字串中取出我們需要的資料 
  • 第12~13行是定義點選點選Notification之後的行為,是要開啟MainActivity,並將訊息透過Extra傳遞過去 
  • 第24行是在重新定義Notification的樣式

public class CustomParseBroadcastReceiver extends ParsePushBroadcastReceiver {

 @Override
 public void onReceive(Context context, Intent intent) {
  try {

   JSONObject json = new JSONObject(intent.getExtras().getString("com.parse.Data"));

   String notificationTitle = context.getString(R.string.app_name);;
   String notificationContent = json.getString("alert").toString();;

   Intent resultIntent = new Intent(context, MainActivity.class);
   resultIntent.putExtra("alert", notificationContent);

   TaskStackBuilder stackBuilder = TaskStackBuilder.create(context);
   stackBuilder.addParentStack(MainActivity.class);
   stackBuilder.addNextIntent(resultIntent);
   PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);

   NotificationCompat.InboxStyle inboxStyle = new NotificationCompat.InboxStyle();

   //show custom notification
   NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
    .setSmallIcon(R.drawable.icon)
    .setContentTitle(notificationTitle)
    .setContentText(notificationContent)
    .setStyle(inboxStyle)
    .setContentIntent(resultPendingIntent)
    .setAutoCancel(true);

   int mNotificationId = 001;
   NotificationManager mNotifyMgr = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
   mNotifyMgr.notify(mNotificationId, builder.build());

  } catch (JSONException e) {
   Log.d(Application.APPTAG, e.getMessage());
  }
 }
}

然後在MainActivity取出extras裡的值
Bundle extras = getIntent().getExtras();
if (extras != null) {
    String msg = extras.getString("alert");
    //Do something
}
當然,別忘了要將CustomParseBroadcastReceiver註冊到AndroidManifest.xml
<receiver
    android:name=".CustomParseBroadcastReceiver"
    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>

相關文章

如何將電腦畫面經由 Chromecast 投放到電視螢幕上

Chrome 的檔案續傳功能

隱私權政策產生器 Privacy Policy Generator

使用 Vysor 在電腦上控制 Android 裝置