通知,PendingIntent和Intent Flags问题

时间:2011-12-13 22:43:13

标签: android notifications android-intent android-pendingintent

(省略简短摘要)我的应用程序中的活动序列出现问题。该应用程序有3个Activity,它从A流向B流向C(如果连续按下,则从C流向B流向A)。在正常操作中,应用程序运行正常,我遇到的问题是收到C2DM通知时。

收到通知后,我希望将PendingIntent发送到当前活动的活动,或者在应用未运行的情况下启动应用。

在通知接收器中,使用当前活动(在Application类中保存)创建PendingIntent,这也可以正常工作。

但是,当活动从使用。创建PendingIntent的活动发生变化时会出现问题。

即在活动C中收到通知,并且创建PendingIntent时Intent指向活动C.用户导航回活动A并单击触发意图的通知并启动活动C并且我希望将其发送到甲

我想要的是将意图发送到当前活动的任何内容。我尝试创建一个作为PendingIntent的目标的Activity X,然后在创建Activity X时检查哪个Activity当前处于活动状态,并存储在Application类中。

但是我在这里也遇到了Intent标志的问题。我想使用SINGLE_TOP标志来确保为当前Activity调用onNewIntent,以便我不会遇到onCreate和onResume中的代码问题。

我在这里遇到的问题是,活动X现在位于活动堆栈的顶部,单顶不会因此而存在。我已经尝试使用NO_HISTORY和EXCLUDE_FROM_RECENTS标志来处理挂起的意图,这样就不会将Activity X添加到堆栈中,然后使用SINGLE_TOP来启动活动A,B或C,但是它创建了一个新实例,而不是使用那个存在。

摘要:

 4 activities: A,B,C,X and a receiver for notifications.

 on receipt of a notification:
     //not sure which is better to use or even if they're right for my purpose
     start X with a PendingIntent with FLAG_ACTIVITY_NO_HISTORY or FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

     Acivity X then gets the currently running activity from Application (A,B or C)
         create an intent for the current activity (A,B or C) with FLAG_ACTIVITY_SINGLE_TOP

But onNewIntent is never called a new instance of A,B or C is created.

对于这个问题是否有更明智的方法,我使用的标志是错误的吗?我是否误解了意图工作方式的基本原则,任何帮助都会受到赞赏。抱歉这个长期的问题。此外,如果需要代码,我可以在明天发布,因为我离开工作站。

2 个答案:

答案 0 :(得分:4)

回答Suchi给了我一个尝试在清单中设置值的想法。

所以在Activity X的清单中

android:noHistory="true"
android:launchMode="singleInstance"

以及A,B和C的行为清单

android:launchMode="singleTop"

我仍然在我的未决意图中使用NO_HISTORY标志

startActivity.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY); 
PendingIntent contentIntent = PendingIntent.getActivity(context, 0,
            startActivity, PendingIntent.FLAG_UPDATE_CURRENT);

并在活动X中,然后将意图发送到A,B或C

    //onCreate
    myApp = (MyApplication)getApplication();
    String s = myApp.getCurrentActivity();

    if(s.equals(myApp.ACTIVITY_A)){
        Intent intent = new Intent(this,ActivityA.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }

    if(s.equals(myApp.ACTIVITY_B)){
        Intent intent = new Intent(this,ActivityB.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }

    if(s.equals(myApp.ACTIVITY_C)){
        Intent intent = new Intent(this,ActivityC.class);
        intent.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
        startActivity(intent);
    }
    finish();

通过广播接收器接收通知,将未决意图发送到活动X,活动X基于当前活动名称(在应用程序中保存)向当前活动活动发送意图并在onNewIntent方法中接收。

答案 1 :(得分:1)

你试过android:noHistory吗?