Java 安卓:在前面保持警惕,这样用户就必须做出反应

Java 安卓:在前面保持警惕,这样用户就必须做出反应,java,android,Java,Android,我的应用程序显示了一个警报,用户必须在继续执行其他操作之前做出响应。我正试图找出实现这一点的最佳方法。将活动用于警报并不十分有效 在我当前的实现中,警报是活动(A)。当启动同一个包中的另一个活动并调用onStop时,它将使用标志“活动”再次启动,以便它始终位于堆栈的顶部。除非活动A使用Theme.Dialog或Theme.Translucent,否则此操作将按说明进行 修改日志: Activity A created Activity A started Activity A resumed A

我的应用程序显示了一个警报,用户必须在继续执行其他操作之前做出响应。我正试图找出实现这一点的最佳方法。将活动用于警报并不十分有效

在我当前的实现中,警报是活动(A)。当启动同一个包中的另一个活动并调用onStop时,它将使用标志“活动”再次启动,以便它始终位于堆栈的顶部。除非活动A使用Theme.Dialog或Theme.Translucent,否则此操作将按说明进行

修改日志:

Activity A created
Activity A started
Activity A resumed
Activity A paused
Activity B created
Activity B started
Activity B resumed
Activity B gains window focus
Activity A stopped
Top activity in stack is Activity B, so Activity A relaunches itself
Activity B paused
Activity A started
Activity A resumed
堆栈中的顶部活动应该是活动A,但活动B仍保留在前台

另一个实现细节:我的应用程序不适用于手机,因此我不关心“后退”按钮完成活动或与其他应用程序的交互。尽管如此,我还是同意原则上我应该防止此类问题,因此在我的代码中,我检查前面的活动是否来自同一个包(即我们的代码库)。这应该解决干扰其他应用程序的理论问题

有没有办法让活动成为焦点?我知道这是不寻常的行为,但活动A必须保持在前台,直到它被故意完成

我也愿意接受关于完全不同和更好的方法的建议

FWIW,我正在运行2.2


(交叉发布,我们没有得到回应。)

好吧,我想说的是:

public class ActivityA extends Activity
{

    ...

    public void onStop() {
        super.onStop();
        finish();
        Intent i = new Intent();
        i.setClass(getApplicationContext(), ActivityA.class);
        startActivity(i);
    }
}

ActivityA
onStop()中完成并立即重新启动。您可能需要检查有关设备旋转的问题,但这种方法应该有效。

您不能这样做。请不要这样做。堆栈顶部的活动是具有输入焦点的活动。您试图做的事情从根本上破坏了应该发生的用户交互


平台通常认为您所做的是对它的滥用,而Android也越来越多地采取措施防止此类应用程序造成伤害。

具有窗口焦点意味着活动B仍在其可见生命周期内,因为它上面有一个活动A,它有一个半透明的背景或类似对话框

拥有窗口焦点并不意味着活动B就在前台。它们是不同的东西


如果您不想这样做,那么就不要使用这两个主题。

您考虑过重新启动活动吗?我已经检查过了,它可以工作了。我尝试在onStop中完成活动A,然后从onDestroy重新启动它,但直到活动B被销毁后,它才重新启动。你还有别的想法吗?我有点搞不清哪项活动使用了上述主题。是B还是A?另外,为了澄清问题,您是否可以发布一个小片段,说明如何启动活动?活动a使用半透明的Themegod点,半透明点后面的活动保持可见,并暂停而不是停止。我编辑了我的问题,以使问题更清楚:即使在调用活动A onResume之后,活动B仍保持在前台。在logcat中,活动A似乎已恢复,但它没有收到用户输入,这与我对onResume的理解和活动生命周期中的描述不符(“当活动将开始与用户交互时调用。此时,您的活动位于活动堆栈的顶部,用户输入将进入该堆栈。”)我的应用程序不适用于手机,因此我不关心“后退”按钮完成活动或与其他应用程序的交互(尽管检查前面的活动是否来自同一个包可以防止出现任何问题)。我更新了问题以消除对滥用的担忧。此外,我愿意接受关于更好方法的建议,因此我添加了有关我要实施的原始行为的更多详细信息。再次强调,这是滥用活动所做的。您将无法获得可接受的解决方案。活动不打算以这种方式使用。如果您重新构建自己的系统映像,您可以将自己的窗口添加到窗口管理器中,该窗口管理器位于所有其他活动(或所有活动,包括键盘护卫等)之上。最简单的方法是使用对话框并将其WindowManager.LayoutParams.type设置为系统窗口类型之一。感谢WindowManager选项。我们将对此进行一次尝试。(尽管如此,活动a似乎恢复了,但仍然令人恼火。我也不明白为什么使用不同的主题很重要。)我之所以授予赏金,是因为这样做有效。但为了将来的参考,请注意,这似乎是对活动的滥用——请参见@hackbod的回复,他比我更像是一名安卓专家。