对话框活动还会在后台恢复其他活动

问题描述:

这是场景。我在我的应用程序中有两个活动,并且在单击由我的应用程序创建的通知时启动了一个对话活动。 问题是,当我点击通知时,只有对话框应该显示,而不是我的应用程序的其他活动,如果它停止按主页按钮。对话框活动还会在后台恢复其他活动

当我按下后退按钮关闭我的应用程序时,对话框活动显示对话框,但是当应用程序在后台运行时,该活动也会在创建对话框活动时打开。

我使用@android:style/Theme.Dialog进行我的对话活动。

如何仅显示对话框活动,而不是背景中的其他活动?

+0

你完成()你以前这将启动对话框活动活动? – 2012-07-27 09:41:05

+0

对话活动由通知声明..我想要做的是应用程序的主要活动不应该出现在创建对话框活动时,如果用户不按关闭键关闭主要活动。 – 2012-07-27 09:42:55

解决OP问题的方法是在Manifest中为该活动设置不同的Task关联。

<activity android:name="MyIndependentActivity" 
android:theme="@android:style/Theme.Dialog" 
android:taskAffinity="a_unique_id"> 

的taskAffinity字符串必须从包名称(com.whatever.myapp)

我也使用Android的不同:excludeFromRecents =“真”,隐藏从最近的应用程序列表的对话框,因为通常没有任何意义返回到对话框。

更多信息:http://developer.android.com/guide/components/tasks-and-back-stack.html#Affinities

是的,会发生。

当您声明Dialog的主题时,它会影响活动的生命周期,并且以前的活动不会进入onStop,因此一些Android功能仍然认为它是活动活动,因为您的对话框Activity就像对话框一样行事。

如果你不'关心'你可以看到对话框后面的活动,那么一个可能的解决方法是将对话框更改为DialogFragment,将对话框的主题放在片段上并将其显示在它自己的活动,这将做到这一点。

+0

如何做到这一点? 我真正想要做的只是对话活动应该开始,而不影响背景中的任何东西。 我不希望看到我的应用程序的之前的活动。 – 2012-07-27 09:52:30

+0

但是您会看到它,因为它位于应用程序的Activity堆栈中。如果你想在对话框上它自己的运行,使用'singleTask' launchMode在AndroidManifest:http://developer.android.com/guide/components/tasks-and-back-stack.html#TaskLaunchModes – Blundell 2012-07-27 10:28:36

我这样做的方式(并不是最好的方法)是在activity.onPause()和activity.onResume()方法中有一些逻辑,它会根据我想要的是。我的经验更多的是围绕单独的活动和他们之间的转换,而不是使用对话。

您可以通过setResult()在活动之间传递信息。这将使您能够确定孩子活动决定关闭的原因。与onResume函数结合使用,可以禁用父级活动。

要覆盖对话框以便其他活动在其后面不可见,可能需要使用onPause()方法使其变为半透明。

我发现onStop()非常不稳定的使用,往往是不必要的。其原因在于,从开发者的角度来看,它被称为不可预知的,因为onStop可以根据操作系统是否有足够的内存等等在奇怪的时候调用onPause,但是在我的经验中总是被称为可预测的。

+0

让我试试使活动在onPause上变得透明。另外一个问题:如何使它看起来像以前在onResume?我必须再次设置内容视图吗? – 2012-07-27 09:57:54

+0

我相信它应该已经。如果没有,那么你可以重做setContentView。 – Dessus 2012-07-27 10:03:57

+0

主题化您的应用的一种好方法(即半透明背景)是使用样式/主题。你可以在这里看到操作系统的默认值:https://github.com/android/platform_frameworks_base/blob/master/core/res/res/values/themes.xml – Dessus 2012-07-27 10:06:53