他们是 android 下的一个问题,如果我们关闭应用程序并立即尝试重新打开它,那么如果它仍在关闭过程中,我们会得到一个“白屏死机”。我认为这很正常,android 尝试显示正在运行的应用程序,因为他可能不知道该应用程序正在完成。
通常应用程序必须立即关闭,但有时它们是一些正在运行但不会立即关闭的后台任务(例如 http 连接、正在写入驱动器的文件等)。他们是一种不关心任何事情并且几乎不关闭应用程序的方法吗?
最佳答案
关于英语单词的荒谬之处,根据上下文可以表示它们应该的意思或相反的意思:在这种情况下,'hardly' 一词并不意味着 'aggressively',它的意思是 '几乎没有”或“几乎没有”,但我从这里开始假设你的意思是“几乎没有关闭”意味着“被迫关闭”。
似乎 Application.Terminate
是“官方方式”,至少在较新版本的 Delphi 中是这样。查看 TPlatformAndroid.Terminate
中的实现它做了关闭时应该做的事情。
请注意,在 XE5(包括更新包)中 TPlatformAndroid.Terminate
方法是空的。 Delphi XE6 to XE8 有设置的基础 IFMXApplicationService.Terminating
至 True
,终止计时器并指示底层 native Activity 通过调用 ANativeActivity_finish
完成. Delphi 10 Seattle 通过触发 TForm.OnSaveState
添加到此Delphi 10.1 Berlin 采取措施确保所有这些代码在 FMX 线程中安全运行。
还有其他选项,其中一些选项有各种缺点。一些看似显而易见的候选人的缺点是运行时错误的产生(·_·、)
无论如何,如果你愿意,你可以尝试这些选项:
- 调用主窗体的
Close
方法 -> 似乎在最新版本中有效 - 调用主窗体的
Release
方法 -> 产生一个EListError
由于Release
的行为和实现之间的显着差异,如果从主窗体方法调用,则带有消息不平衡的堆栈或队列操作在 Windows 和 Android 上 - 调用
DisposeOf
针对主窗体 -> 如果从事件处理程序调用会产生访问冲突,这要归功于它的即时效果 - 通常不是一个好的结果 - 调用
finish
通过调用TAndroidHelper.Activity.finish
底层 Android Activity 的方法(依赖于 Androidapi.Helpers 单元)或MainActivity.finish
(依赖于 FMX.Platform.Android 单元)-> 似乎有效 - 调用
Halt
-> 这是终止应用程序的最粗暴的方式,不推荐这样做:应用程序将突然结束,绕过任何重要的清理代码等。 - 调用
kill(getpid, SIGKILL)
在使用 Posix.Pthread、Posix.Unistd 和 Posix.Signal 方法之后 -> 另一种非常粗糙的方法(可能是最粗糙的),不推荐:应用程序将突然结束绕过任何重要的清理代码等。
关于android - delphi如何在android下强制关闭应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39681028/