1

我有一个“列表”活动,单击时会启动一个“文章”活动。我也有直接打开“文章”活动的推送通知。

当来自通知时,我将“文章”活动中的后退按钮行为更改为启动“列表”活动,以便用户返回文章列表。

问题是当应用程序已经在后台打开并且我打开一个通知时 - 它只是将它带回前面。我想要实现的是在单击通知并返回“列表”活动时打开正确的文章,而列表活动可能会打开两次。

我试图分离“文章”任务并在通知意图中创建新任务,但是当打开多个通知并单击返回时,它会打开单独的“列表”活动。

定义活动的任务和意图标志以实现我的目标的正确方法是什么?

编辑:清单部分:

<activity android:name="ListFeed" android:configChanges="orientation|screenLayout" android:launchMode="singleInstance" android:screenOrientation="unspecified"
        android:taskAffinity="com.app.MyTask"></activity>
        <activity  android:name="Article" android:launchMode="standard" android:configChanges="orientation|screenLayout" android:screenOrientation="unspecified"
            android:taskAffinity="com.app.MyTask"></activity>

通知意图:

Intent notificationIntent = new Intent(context, Article.class);
PendingIntent contentIntent = PendingIntent.getActivity(context, notificationID, notificationIntent, PendingIntent.FLAG_ONE_SHOT);

谢谢!!

4

2 回答 2

0

我从你的问题中得到的是 1)你有 listActivity A

2)ArticalActivity B。

i)首先,您想在从 B 回来时打开活动 A,对吗?为此,您可以使用dispatchKeyEvent,收听后退按钮事件并开始活动 A. 或使用以下代码

@Override
public void onBackPressed() {
    Intent intent = new Intent(this, MainActivity.class);
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    startActivity(intent);
}

ii)您只想打开活动 A(列表)的单个实例。为此,您基本上可以 launchMode在活动 A 的清单声明中使用singleInstance.

android:launchMode="singleTask"

您可以阅读启动模式的文档

如果我错过了什么,请告诉我。

于 2012-07-08T17:44:34.287 回答
0

我看到您正在使用 launchModes 和 excludeFromRecents,这不是一件好事。Android 的标准行为应该可以满足您的需求。

为了验证这一点,我创建了一个简单的 3 活动应用程序,其中包含一个 MainActivity、一个 ListActivity 和一个 ArticleActivity。我没有使用任何非标准的启动模式,也没有设置任何 Intent 标志(onBackPressed()见下文除外)。主要活动创建并发布通知以显示特定文章。MainActivity 启动 ListActivity。ListActivity 的每个元素都为 ArticleActivity 启动一个 Intent,并在 EXTRAS 中传递一些信息,以便 ArticleActivity 知道要显示哪篇文章。

为了获得您描述的行为(即:从通知启动应用程序后从 ArticleActivity 返回到 ListActivity,即使应用程序没有运行),我已经完成了 Ankit 的建议(即:onBackPressed()在 ArticleActivity 中覆盖)像这样:

@Override
public void onBackPressed() {
    // Return to ListActivity
    Intent intent = new Intent(this, ListActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
    startActivity(intent);
    // Finish this activity (in case the ListActivity wasn't already in the stack)
    finish();
}

我之所以使用它FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP是因为如果 ListActivity 已经存在于活动堆栈中,它不会重新创建它(即:它将返回到同一个实例)。

我必须添加finish()调用,因为如果应用程序没有在后台运行并且用户从通知启动它,则会创建 ListActivity 并将其放在ArticleActivity之上。然后当用户按下“返回”离开 ListActivity 时,ArticleActivity 就会暴露在下面。在此处添加finish()会使 ArticleActivity 消失,以便从 ListActivity 按“返回”返回到它来自的任何位置。

如果您希望我将代码发送给您,请告诉我。

于 2012-07-09T11:45:21.193 回答