如何正确定义活动和意图以按照需要行事?

时间:2012-07-08 17:35:38

标签: android android-intent android-activity

我有一个“列表”活动,点击后会启动“文章”活动。 我还有推送通知,直接打开“文章”活动。

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

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

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

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

编辑: 清单部分:

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

谢谢!

2 个答案:

答案 0 :(得分: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(列表)的单个实例。对此你基本上可以使用  活动A的清单中的launchModesingleInstance

android:launchMode="singleTask"

您可以阅读docs了解启动模式

让我知道我是否遗漏了什么。

答案 1 :(得分:0)

我看到你正在玩launchModes和excludeFromRecents,这不是一件好事。 Android的标准行为应该完全符合您的要求。

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

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

@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已经存在于活动堆栈中,它将重新创建ListActivity(即:它将返回到同一个实例)。

我必须添加finish()电话,因为如果应用未在后台运行且用户从通知中启动它,则会创建ListActivity并将置于 ArticleActivity。然后当用户按下“后退”以退出ListActivity时,ArticleActivity将暴露在下面。在此处添加finish()会使ArticleActivity消失,以便从ListActivity按“back”返回到它来自的任何地方。

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