【Titanium, Android】Notificationからアプリにデータを渡す

notification_tap_android新着プッシュ通知(Notification)をアプリ側に表示して、それを押したら新着記事を表示する方法を調査したときの覚書。

Androidで嵌った。

環境: Titanium SDK 3.3.0.GA

プッシュ通知を受け取るまでは前の記事を参考に。

 

Notificationをタップして発行するIntentにpushExtraでセットした値が取れない。試したこと。

  • Windowの「focus」イベントで渡されたActivityを参照
    Ti.Android.currentActivity.intent.getStringExtra(Ti.Android.EXTRA_TEXT)
  • Windowの「focus」イベントで渡されたActivityを参照。引数のイベントオブジェクトから参照。
    e.source.activity.intent.getStringExtra(Ti.Android.EXTRA_TEXT)
  • 起動後にrequireされた別ファイルでゴニョゴニョしているときに参照。
    Ti.Android.currentActivity.intent.getStringExtra(Ti.Android.EXTRA_TEXT)

どれもダメ。

 

どうやらIntentが渡されるActivityを勘違いしているみたい。

そもそも今起動中のActivityは何?

このサイトを参考に今起動中のActivityを表示。
$ cd /Applications/android-sdk-macosx/platform-tools/
$ ./adb shell dumpsys activity | grep -i run

  Running activities (most recent first):
      Run #3: ActivityRecord{4216fae0 com.hoge.appdemo/org.appcelerator.titanium.TiActivity}
      Run #2: ActivityRecord{426a7da0 com.hoge.appdemo/.HogeAppActivity}
      Run #1: ActivityRecord{41c99bf0 com.sec.android.app.twlauncher/.Launcher}
      Run #0: ActivityRecord{41bb6d98 com.sec.android.app.controlpanel/.activity.JobManagerActivity}
ACTIVITY MANAGER RUNNING PROCESSES (dumpsys activity processes)

なぜか2つある。

このアプリはWindow1つだけなので、たぶんアプリとWindowかな?

と思いつつ、(Windowではなく)直接app.jsに書いてみると。。。

// Start the APP
require('/lib/core').init();

// Notification Test
console.log(Ti.Android.currentActivity.getStringExtra(Ti.Android.EXTRA_TEXT));

取れた!

 

どうやらAndroidのActivityに関して理解する必要がありそう。

 

ソースを見たわけではないけれど、Titaniumは起動後にアクティビティを作って、その後win.openすると「org.appcelerator.titanium.TiActivity」を生成するみたい。

まだ曖昧な部分があるけれど、動いたサンプルコードを一部抜粋。

app.js

// win.openする前でもTi.Android.currentActivityを取得可能

// Start the APP
// init関数の中ではNotificationからの値を取得できなかった。
require('/lib/core').init();

// Notification
if (Ti.Platform.osname == 'android') {
    var act = Ti.Android.currentActivity;
    var intent = act.intent;
    console.log(intent.getStringExtra(Ti.Android.EXTRA_TEXT));
    // ここでフラグ設定しておいて、windowのopenイベントで処理する
}

 

notification.js

/**
* This called from require('com.activate.gcm').registerC2dm
*/
function handlePushReceiveAndroid(e) {
    var intent, pending, notification;

    // Show Notification
    intent = Ti.Android.createIntent({
        className: Ti.App.getID() + '.HogeAppActivity',
        flags: Ti.Android.FLAG_ACTIVITY_NEW_TASK | Ti.Android.FLAG_ACTIVITY_CLEAR_TOP
    });
    intent.putExtra(Ti.Android.EXTRA_TEXT, 'test desu');

    // Intent for Click Notification
    pending = Ti.Android.createPendingIntent({
        intent: intent,
        flags: Ti.Android.FLAG_UPDATE_CURRENT
    });

    // Create Notification
    notification = Ti.Android.createNotification({
        contentIntent: pending,
        contentTitle: e.data.message,
        //flags: Ti.Android.FLAG_ONGOING_EVENT | Ti.Android.FLAG_NO_CLEAR
    });

    // Show
    Ti.Android.NotificationManager.notify(1, notification);
}

 

Notificationをタップしたときは常にアプリを起動し直す。本当は起動しているときはintentが更新されたイベントだけキャッチして処理したかった。今度再調査。

サーバーからのデータはputExtraするときにJSON形式で格納しておけばいいと思う。

最終的にはapp.js内のinitの引数にTi.Android.currentActivityを渡して処理することにした。

 

< Related Posts >