【问题标题】:Notification, PendingIntent and Intent Flags problemsNotification、PendingIntent 和 Intent Flags 问题
【发布时间】:2011-12-13 22:43:13
【问题描述】:

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

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

在通知接收器中,无论当前活动是什么(保存在 Application 类中)都会创建一个 PendingIntent,这也可以正常工作。

但是,当 Activity 与创建 PendingIntent 的那个不同时,就会出现问题。

即在 Activity C 中收到通知,并使用指向 Activity C 的 Intent 创建 PendingIntent。用户导航回 Activity A 并单击通知,该通知触发 Intent 并启动 Activity C,我希望将其发送到A.

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

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

我在这里遇到的问题是 Activity X 现在位于 Activity 堆栈的顶部,而单顶不是因为这个。我已尝试将 NO_HISTORY 和 EXCLUDE_FROM_RECENTS 标志用于未决意图,以便不将活动 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.

有没有更明智的方法来解决这个问题,我使用的标志是错误的吗?我是否误解了有关意图工作方式的基本知识,任何帮助将不胜感激。很抱歉这个冗长的问题。此外,如果需要代码,我可以在明天离开工作站时发布它。

【问题讨论】:

    标签: android notifications android-intent android-pendingintent


    【解决方案1】:

    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);
    

    在 Activity X 中,然后将 Intent 发送给 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();
    

    通知通过广播接收器接收,挂起的意图被发送到 Activity X,它基于当前活动名称(保存在应用程序中)向当前活动的活动发送一个意图并在 onNewIntent 方法中接收。

    【讨论】:

      【解决方案2】:

      你试过android:noHistory吗?

      【讨论】:

      • 刚刚尝试过但没有用,但它确实让我走上了寻找答案的正确轨道。
      猜你喜欢
      • 2014-08-31
      • 1970-01-01
      • 2014-08-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-06
      • 1970-01-01
      相关资源
      最近更新 更多