【Titanium, Android】Notificationからアプリにデータを渡す
新着プッシュ通知(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 >