我有一个“列表”活动,点击后会启动“文章”活动。 我还有推送通知,直接打开“文章”活动。
我更改了“文章”活动中的后退按钮行为,以便在来自通知时启动“列表”活动,以便用户返回文章列表。
问题是当应用程序已经在后台打开并且我打开通知时 - 它只是将它带回到前面。 我想要实现的是在点击通知并返回“列表”活动时打开正确的文章,而列表活动不会打开两次。
我尝试将“文章”任务分开并在通知意图中创建新任务,但在打开多个通知并单击后,它会打开单独的“列表”活动。
定义活动的任务和意图标志以实现目标的正确方法是什么?
编辑: 清单部分:
<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);
谢谢!
答案 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的清单中的launchMode
为singleInstance
。
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”返回到它来自的任何地方。
如果您希望我发给您代码,请告诉我。