Android Yes I want to close the app I opened!
我有一个应用程序,我想打开,使用,然后按下按钮关闭。 我的问题是,我是否需要保留应用程序状态的单例数据才能实现此目的? 我的意思是,如果我采用在resume()上完成的解决方案,这意味着我应该保留每个活动看起来关闭的全局数据? 这是关闭应用程序的一种很好的,虽然很尴尬的方式,但除非我很快听到另一种方式,否则我会继续使用它。
谢谢。
PS请不要回复android将决定何时以及如何处理您的应用程序。 对不起,但我知道我的用户确实希望在点击完成后再次看到这个应用程序! 最后重要的是,他们对Android需要对应用程序做什么也不感兴趣,也不应该。
-
退出应用程序的可能重复 - 这是不赞成的吗?
-
好吧,我不认为那里有效回答。
-
理解,但我想要做的是得到一个意见,我是否需要保持单例数据来解决这个问题。
-
@Androider:你不清楚自己想要什么:你想破坏应用程序,就像在常规桌面应用程序中一样,或者你想要隐藏它并确保它下次保持打开状态?"我很抱歉,但我知道我的用户确实希望在点击完成后再次看到这个应用程序!"是一个非常混乱的句子。
-
你的问题不是那么清楚。你能详细一点吗?
-
是的,它在一些帖子中得到了部分回答,但我不认为这些答案是必要的。我们需要就这个操作系统限制的理性问题达成共识。
-
好。我有一个活动A1,A2,A3,A4的应用程序。如果我在说活动A3,我按完成/完成。如果它是恢复的主要活动,我不想要像A1这样的其他活动。我希望应用程序关闭,以便在用户重新启动之前它永远不会再显示。这种情况,我认为这有点普遍。
-
这一切都与意图有关。用户是否无权发布意图。我希望这件事关闭,我不想再看到它,直到我要求它?
-
@Androider:这不是"操作系统限制",不仅仅是"操作系统限制",您无法从Web应用程序强行关闭用户的浏览器。
-
仅在其中一个活动中执行finish()是不够的。它只关闭那个活动,所以另一个活动可以恢复,特别是主活动。所以真的在不止一个活动必须完成,这就是关于状态的问题,现在需要管理它。
-
是的,但您可以关闭浏览器。它的应用程序。如果您关闭浏览器并且它一直弹出,该怎么办?
-
它的全部内容是用户有权在重新启动应用程序之前结束应用程序的使用。
-
顺便说一下,并非所有Android情况都必然是手机或拥有手机的所有按钮。那些使用触摸屏的专用设备呢?这就是为什么这种能力很重要。
如果你想要杀死你的应用程序,也许你可以使用System.exit(0)。
从评论中可以看出,您需要从主要活动中完成。我的方式(尽管可能有更简洁的方法)是在主活动中添加一个静态处理程序:
1 2 3 4 5 6 7
| static Handler handler = new Handler() {
@Override
public void handleMessage(Message msg)
{
System.exit(2);
}
} |
和静态方法:
1 2 3 4
| static public Handler getExitHandler()
{
return handler;
} |
在每个类中,我获取此处理程序并在我要退出时向其发送消息:
1
| MyMainActivity.getExitHandler().sendEmptyMessage(0); |
再次,不是那么干净,但System.exit(2);一样
-
我试过这个,但实际上它仍然可以回到主要活动。
-
所以从主活动(例如处理程序)来做。
-
当你决定采取行动时,你可能不会参加主要活动,它可能会出现在最后。主resume()方法可以包含这个,但是需要检查一些状态。无论如何,我认为Android可能只是认为它崩溃并尝试重新启动它。
-
@Androider - 使用处理程序,您可以从任何地方获取主要活动,并且关于崩溃,System.exit(2)会告诉它应用程序已经完成,没有理由重新启动它(我今天实际使用它) ,它解决了我遇到的一个大问题...)
-
好吧,我将尝试System.exit(2),看看效果是什么。
-
发出System.exit(2)的效果是将我的应用程序发送到主活动登录。
-
出于好奇,您是按照我的建议从主要活动还是主要活动中完成的?我刚试了一次,没有问题,应用程序已经关闭,日志显示Process 2120 exited cleanly
-
我在主要活动的onCreate中发出了一个自定义的close_action,并从那里调用完成。也称为System.exit(2)没有效果。住在主页上。似乎因为我在创建方法或许。
-
您究竟是如何访问主要活动并完成结束的?
-
我将编辑我的答案来解释,因为它不止一个LOC。
-
请跟进,以便以后不需要重新审视这个问题。我想一劳永逸地解决这个问题。
-
它仍然将其视为崩溃,因为我有一个正在运行的服务。
-
需要一种方法可以在某种程度上可靠地停止服务,然后这将适用于具有服务的应用程序。
嗯,有一个原因,每个人都这么说,并且与"你不关闭网页"相同。我不知道用户会期望什么,但这是Android / iOS的工作方式。
我已经使用过标记ACTIVITY_CLEAR_TOP(您在意图上设置标志以打开包含关闭按钮的活动),因此以这种方式删除活动堆栈,仅删除当前活动remaning:所以当你完成();该应用程序"关闭"。
1 2 3
| Intent intent = new Intent(this, Some.class);
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivity(intent); |
-
我想我理解这个。
-
要通过从活动中单击一次来完成此工作,可能需要将其发送到将执行结束的隐藏活动。
-
如果没有隐藏活动,我猜想在设置FLAG_ACTIVITY_CLEAR_TOP的相同意图上设置自定义关闭操作,并捕获一些现有活动。
-
我刚刚对主要活动进行了测试。在创建中接收到意图后执行完成()不会关闭活动...它将保留在同一活动上。
-
我也按照你的建议尝试并使用意图标志发送到另一个活动并按下完成按钮。结果是它返回到发出startActivity()的活动......
-
它还需要做一个System.exit()?
-
所以我完全按照您所描述的那样发布了这个意图,并将其发送到带有关闭应用按钮的活动。当我点击它时,它返回到发出startActivity(intent)的活动,如果另外我在调用startActivity(intent)之后立即完成它会返回到第一个主要活动。现在我将尝试将按钮放在主要活动中,看看会发生什么。
-
BTW,这可能需要完成的原因,在我的情况下是一个专用的平板设备,全触摸屏。
-
我明白为什么它不是通常为手机应用程序做的事情。
-
请注意,我无法确认是否已关闭或甚至隐藏所有活动。你真的实现了吗?如果是这样,请详细说明。
-
从理论上讲,它看起来确实是最好的方式,但到目前为止它还没有受到考验。
-
这可能不适用于我的情况,因为我的应用程序有服务...
-
我不知道在这一点上。也许我需要广播一个关闭意图,并在每个级别处理它。
-
所以我猜你的解决方案在涉及服务时不起作用。毕竟,即使你完成了主要活动,你也没有完成服务。还有更多工作要做。
-
我将尝试之前发出一个stopService,看看这是否有所不同。你能否至少评论一下你看到这种方法的工作情况?
您可以弹出一个通知用户的对话框:"应用程序将在x秒内关闭"并启动一个计时器,该计时器在活动结束时调用活动结束()。
-
这将使其更加用户友好,但它需要与删除清除堆栈相结合,因为另一个活动仍然可以打开。