0

我在一个愚蠢的问题上被困了几个小时。

我的应用程序由 2 个活动组成:A(主)和 B。还有一个服务 S。“正常”任务堆栈是 AB,S 在后台运行。

当我想通过通知直接到达活动 B 时,就会出现我的问题。我必须构造任务堆栈以获取 AB 以保持返回按钮的默认行为。(我希望用户可以回到 A)。

因为我使用了 API 7,所以我不能使用 android 开发者教程http://developer.android.com/guide/topics/ui/notifiers/notifications.html中所示的意图数组。所以我决定在通知发送的意图中添加一个自定义操作(S.ACTION_CUSTOM),以便在活动 A 的 onCreate() 中区分这种情况。

与服务 S 中声明的通知相关联的意图:

Intent notificationIntent = new Intent(this, A.class);
       notificationIntent.setAction(ACTION_CUSTOM);

现在在 A 中,在 onCreate() 方法的末尾,我添加:

if (S.ACTION_CUSTOM.equals(getIntent().getAction())) {
        Intent intent = new Intent(this, B.class);
        intent.setAction(S.ACTION_CUSTOM);
        startActivity(intent); 
 }

此代码用于从通知直接转到 B 并授权返回 A。但是一旦我使用了通知“快捷方式”,则在应用程序启动时直接到达 B,即使是从主菜单也是如此。我已经尝试了很多事情来了解会发生什么,但即使我在 A 中的 if 语句末尾添加 getIntent().setAction(ANYTHING),行为也是一样的。

谁能告诉我我的代码发生了什么?Morover 我对另一种实现愿望的方法持开放态度。

谢谢。

编辑:

XML清单的一部分:

<activity
        android:name=".A"
        android:label="@string/app_name" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
</activity>
<activity
        android:name=".B"
        android:label="@string/app_name" >
</activity>

但我认为意图过滤器与我的问题无关。

4

1 回答 1

1

通过更多的测试,我找到了原因和解决方案。

事实上,当我说我从主菜单重新启动应用程序时,这不是真的。我从“最近的活动”(长按主页)中重新启动了它。但是,在这种情况下,似乎 android 会以运行它的最后一个意图启动应用程序。所以它在家里可以正常工作(因为 Intent.ACTION_MAIN 的新意图是触发),但不是来自最近的活动,因为与先前具有相同操作的意图被一次又一次地触发(在我的情况下为 ACTION_CUSTOM)。

为了将意图与“最近的活动”和“通知”区分开来,我使用了标志。对于最近的活动,意图具有标志 Intent.FLAG_ACTIVITY_LAUNCED_FROM_HISTORY。

所以我通过在 if 语句中添加一个条件来修复我的代码:

if (S.ACTION_CUSTOM.equals(getIntent().getAction()) && (getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) == 0) {
        startActivity(getIntent().setClass(this, B.class));  
}

我的真实代码有点复杂,有 4 个活动而不是 2 个,但一切正常,每个活动都将意图传递给下一个活动。堆栈构建良好,当用户从通知以外的其他地方启动应用程序时,会保留默认行为。

希望这将帮助某人避免浪费时间来理解为什么意图看起来很疯狂。

于 2012-06-15T22:26:27.053 回答