通知、挂起意图(PendingIntent)和意图标志(Intent Flags)问题

4
我在应用程序的Activity顺序方面遇到了麻烦。该应用程序有3个Activity,从A流向B再到C(或者如果连续按下返回键,则从C流向B再到A)。在正常操作中,应用程序运行良好,我遇到的问题是当收到C2DM通知时。
在接收到通知时,我希望PendingIntent发送到当前活动的Activity,或者在应用程序未运行的情况下启动应用程序。
在通知接收器中,使用当前活动(保存在Application类中)创建了一个PendingIntent,这也很好地解决了。
但是,当活动已经改变时,会出现问题。
即通知在C Activity中被接收,使用指向C Activity的意图创建了PendingIntent。用户导航回到A Activity并单击通知,触发将意图发送到并启动C Activity,并希望将其发送到A Activity。
我想要的是将意图发送到当前活动。我尝试创建一个Activity X作为PendingIntent的目标,然后在创建Activity X时检查当前活动是哪个,该信息存储在Application类中。
但我在这里遇到了问题,涉及到Intent标志。我想使用SINGLE_TOP标志来确保我将使用的Intent调用onNewIntent以便当前Activity不会出现在onCreate和onResume中的代码问题。
我在这里遇到的问题是Activity X现在位于活动堆栈的顶部,而single top由于这个原因不工作。我尝试使用NO_HISTORY和EXCLUDE_FROM_RECENTS标志来创建PendingIntent,以使Activity X不会添加到堆栈中,然后使用SINGLE_TOP启动A、B或C Activity,但它会创建一个新实例而不是使用现有的实例。
总之:
 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个回答

4

Suchi的回答启发了我尝试在清单文件中设置值。

因此,在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();

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


1

刚试了一下,但是没有成功,不过它确实让我找到了答案的正确方向。 - triggs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接