Titanium Android通过通知检索意图附加内容

时间:2014-04-08 10:36:30

标签: titanium-mobile titanium-alloy

我有一个后台服务,我会在应用程序启动后立即启动。如果有新数据可用,此后台服务每5秒向服务器发出一次请求,只要有新数据我就会创建通知。当我点击通知应用程序被启动时,但我无法检索我在创建通知时添加的意图额外参数。

代码下方: index.js

 startService();

 function startService(){ 
    if(OS_ANDROID){  
       log("START SERVICE");
       var intent = Titanium.Android.createServiceIntent({
       url: 'service.js'
    });
    Titanium.Android.startService(intent);
    }
  }





//===========================================
// I tried to add this code so that I could get the intent but it does not work

if(OS_ANDROID){


    log("==========================" + JSON.stringify(Ti.Android.currentActivity));
      // prints : {"bubbleParent":true,"actionBar":{"navigationMode":0,"bubbleParent":true,"title":null,"apiName":"Ti.Android.ActionBar"},"apiName":"Ti.Android.Activity"}



    var _intent = Ti.Android.currentActivity.getIntent();
    log(JSON.stringify(_intent));
    //prints {"bubbleParent":true,"action":null,"type":null,"data":null,"flags":268435456,"apiName":"Ti.Android.Intent"}



    if (_intent.hasExtra('ntfId')) {
       log("========= INTENT HAS EXTRA =========");
    }else{
       log("========= NO INTENT HAS EXTRA =========");
    }


    var currActivity = Titanium.Android.currentActivity;
    var passedInText = currActivity.getIntent().getStringExtra(Ti.Android.EXTRA_TEXT);
    log(passedInText);
     //prints null

}

service.js

function createNotification(data){
log(data.id + " <<<<<<>>>>>> " + data.type);
var activity = Ti.Android.currentActivity;
var intent = Ti.Android.createIntent({ 
    className : 'packageName.AppNameActivity',
    action: Ti.Android.ACTION_MAIN,
    packageName: Ti.App.id,
    flags: Ti.Android.FLAG_ACTIVITY_NEW_TASK | Ti.Android.FLAG_ACTIVITY_SINGLE_TOP
});
intent.addCategory(Titanium.Android.CATEGORY_LAUNCHER); 

intent.putExtra("ntfId", data.id);

var pending = Ti.Android.createPendingIntent({ 
    intent : intent
});

var notification = Ti.Android.createNotification({
    contentIntent : pending,
    contentTitle : data.title,
    contentText : data.desription,
    tickerText : "AppName",
    icon : Ti.App.Android.R.drawable.appicon,
    sound: 'default',
    defaults: Titanium.Android.NotificationManager.DEFAULT_VIBRATE,
    flags : Titanium.Android.ACTION_DEFAULT | Titanium.Android.FLAG_AUTO_CANCEL | Titanium.Android.FLAG_SHOW_LIGHTS
});



Ti.Android.NotificationManager.notify(data.notification_id, notification);
}

我想在我的应用程序打开时获取“ntfId”,这样我就可以知道我点击了哪个通知并显示了正确的数据。

到目前为止,我发现的通知只是如何午餐应用程序,这确实有效,但没有明确的示例如何获取通知详细信息。 我遵循了linkdocs,但我使用的是合金模型。

如果有用,我也会添加我的TiApp.xml:

    <android xmlns:android="http://schemas.android.com/apk/res/android">
    <manifest>
        <uses-permission android:name="android.permission.VIBRATE"/>
        <application android:debuggable="true">
            <activity
                android:configChanges="keyboardHidden|orientation"
                android:name="org.appcelerator.titanium.TiActivity" 
                android:screenOrientation="portrait"/>
            <activity
                android:configChanges="keyboardHidden|orientation"
                android:label="Appname"
                android:launchMode="singleTask"
                android:name=".AppnameActivity"
                android:screenOrientation="portrait" android:theme="@style/Theme.Titanium">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN"/>
                    <category android:name="android.intent.category.LAUNCHER"/>
                </intent-filter>
            </activity>
        </application>
    </manifest>
    <services>
        <service url="service.js"/>
    </services>
</android>

如何获取通知意图传递的额外参数?好像当我执行getCurrentActivity.getIntent()时,它的另一个意图与我想要的完全不同。

你能告诉我一些事情或指向某个我可能错过的地方吗? 谢谢!

上次修改 我把我的项目推上了gihub,TiAndroidNotification你可以克隆它并尝试,看看你是否可以改变一些东西......它还没有用,我还在努力解决这个问题。 感谢您提供任何帮助或反馈!

3 个答案:

答案 0 :(得分:1)

我想出了一半。 创建待定意图时,我们应该添加活动:

var activity = Ti.Android.currentActivity;
var pending = Ti.Android.createPendingIntent({ 
    activity:activity,
    intent : intent
});

从index.js我得到它:

var act = Titanium.Android.currentActivity;
var _intent = act.intent;
var message = _intent.getStringExtra("ntfId");

只要我关闭应用程序,这样就行了,但是如果应用程序只是在后台,我单击通知它会传递null并且我不明白为什么..

答案 1 :(得分:0)

我用Ti.Android.FLAG_ACTIVITY_NEW_TASK |替换了标志Ti.Android.FLAG_ACTIVITY_MULTIPLE_TASK,它的工作完美。它会重新启动应用程序,但它可以正常运行。

您也忘了将“type:Titanium.Android.PENDING_INTENT_FOR_ACTIVITY”添加到待处理状态。

答案 2 :(得分:0)

这里的js模块我用

https://gist.github.com/muka/d4afae20a5732f3937e8

当app处于后台或前台时,似乎正确响应

基本上,主要活动会监听newintent事件并在作为参数收到的意图附加内容中查找预期数据

我很想知道它是否适用于不同的用例,请告诉我。

由于