3

(跳过简要摘要)我在应用程序中的活动序列遇到问题。该应用程序有3个活动,从A流到B到C(或从C到B到A,如果连续按下)。在正常的操作中,应用程序工作正常,我遇到的问题是收到C2DM通知时。通知,PendingIntent和意图标记问题

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

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

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

即在Activity C中收到通知,并且PendingIntent是通过指向Activity C的Intent创建的。用户返回到Activity A并单击通知,触发该intent并启动Activity C,并且我希望它发送到A.

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

但我在这里也遇到了问题与意图旗帜。我想使用SINGLE_TOP标志的意图,我将用来确保onNewIntent调用当前的活动,这样我就不会有代码在onCreate和onResume 。

我在这里遇到的问题是Activity X现在处于活动堆栈的顶部,而单个top并不是因为这一点。我已经尝试使用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. 

有没有更合理的方法解决这个问题,是我错了使用标志?我是否理解了关于意图工作方式的基本理念,对此我将不胜感激。对于长期的问题感到抱歉。此外,如果需要代码,我可以明天发布,因为我离开了我的工作站。

回答

4

答案苏希给了我一个尝试设置清单中的值的想法。

所以在清单中的活动X

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

,并在清单的Actvities 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发送的意图的当前活动的活性和onNewIntent方法接收。

+0

太棒了。很高兴它有帮助! – Suchi 2011-12-14 14:02:36

0

你试过android:noHistory

+0

刚刚尝试过,但没有奏效,但它确实让我找到了正确答案。 – triggs 2011-12-14 10:28:25