我的应用程序会在继续执行其他操作之前显示用户必须响应的警报。我正试图找出实现这个的最佳方法。使用活动进行警报并不是很有效。
在我目前的实施中,警报是活动(A)。当启动来自同一个包的另一个活动并调用onStop时,它将使用FLAG_ACTIVITY_REORDER_TO_FRONT再次启动它,以便它始终位于堆栈的顶部。除非活动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成为焦点?我知道这是不寻常的行为,但是活动A必须保持在前台,直到它被故意完成。
我也愿意接受有关完全不同且更好的方法的建议!
FWIW,我正在运行2.2。
(从http://groups.google.com/group/android-developers/browse_thread/thread/d46fd7d59abe15a0交叉发布,我们没有回复。)
答案 0 :(得分:6)
你不能这样做。请不要这样做。堆栈顶部的活动是具有输入焦点的活动。你想要做的事情从根本上打破了应该发生的用户互动。
平台通常认为你正在做的事情是滥用它,Android越来越多地采取行动阻止此类应用程序造成伤害。
答案 1 :(得分:3)
嗯,这就是我的想法:
public class ActivityA extends Activity
{
...
public void onStop() {
super.onStop();
finish();
Intent i = new Intent();
i.setClass(getApplicationContext(), ActivityA.class);
startActivity(i);
}
}
ActivityA
已在onStop()
中完成,并立即重新开始。您可能必须检查有关设备轮换的问题,但这种方法应该有效。
答案 2 :(得分:1)
具有窗口焦点意味着活动B仍处于其可见生命周期中,因为它具有顶部活动A,其具有半透明的bg或类似对话框。
拥有窗口焦点并不意味着活动B位于前台。它们是不同的东西。
如果您不想这样做,请不要使用这两个主题。