delphi 如何在 android 下强制关闭应用
delphi how to force app close under android
它们在 android 下是一个问题,如果我们关闭应用程序并立即尝试重新打开它,那么如果它仍在关闭过程中,我们会得到一个 "white screen of death"。我认为这很正常,android 尝试显示 运行 应用程序,因为他可能不知道该应用程序正在完成。
通常应用程序必须立即关闭,但有时它们是一些不会立即关闭的后台任务 运行(例如 http 连接、正在写入驱动器的文件等)。他们是一种不关心任何事情并且几乎不关闭应用程序的方法吗?
关于英语单词的荒谬之处,根据上下文可以表示它们应该表示的意思或相反的意思:'hardly' 在这种情况下并不表示 'aggressively',它表示 'barely' 或 'scarcely',但我从这里开始假设您的 'hardly close' 表示 'forced to close'.
似乎 Application.Terminate
是 "official way",至少在 Delphi 的较新版本中是这样。查看 TPlatformAndroid.Terminate
中的实现,它做了关闭时应该做的事情。
请注意,在 XE5(包括更新包)中,TPlatformAndroid.Terminate
方法是空的。 Delphi XE6 到 XE8 具有设置 IFMXApplicationService.Terminating
to True
, terminating timers and instructing the underlying native activity to finish with a call to ANativeActivity_finish
. Delphi 10 Seattle added to this by triggering TForm.OnSaveState
和 Delphi 的基础知识 10.1 Berlin 采取措施确保所有这些代码 运行 在 FMX 线程中安全。
还有其他选项,其中一些选项有各种缺点。一些看似明显的候选人的缺点是产生运行时间错误(·_·、)
无论如何,如果您愿意,可以尝试以下选项:
- 调用主窗体的
Close
方法 -> 似乎在最新版本中有效
- 调用主窗体的
Release
方法 -> 如果从主窗体方法调用,则生成带有消息 不平衡堆栈或队列操作 的 EListError
Release
在 Windows 和 Android 上的行为和实现之间存在显着差异
- 针对主窗体调用
DisposeOf
-> 如果从事件处理程序调用由于其立即效果而产生访问冲突 - 通常不是一个好的结果
- 通过调用
TAndroidHelper.Activity.finish
(依赖于Androidapi.Helpers单元)或[=24=来调用底层Androidactivity的finish
方法](依赖于 FMX.Platform.Android 单元)-> 似乎有效
- 调用
Halt
-> 这是终止应用程序的最粗暴的方式,不推荐这样做:应用程序会突然结束,绕过任何重要的清理代码等。
- 在使用Posix.Pthread、Posix.Unistd和Posix.Signal方法后调用
kill(getpid, SIGKILL)
->另一种极其磨蚀的方法(可能是最磨蚀的),不推荐:该应用程序将绕过任何重要的清理代码等突然结束
它们在 android 下是一个问题,如果我们关闭应用程序并立即尝试重新打开它,那么如果它仍在关闭过程中,我们会得到一个 "white screen of death"。我认为这很正常,android 尝试显示 运行 应用程序,因为他可能不知道该应用程序正在完成。
通常应用程序必须立即关闭,但有时它们是一些不会立即关闭的后台任务 运行(例如 http 连接、正在写入驱动器的文件等)。他们是一种不关心任何事情并且几乎不关闭应用程序的方法吗?
关于英语单词的荒谬之处,根据上下文可以表示它们应该表示的意思或相反的意思:'hardly' 在这种情况下并不表示 'aggressively',它表示 'barely' 或 'scarcely',但我从这里开始假设您的 'hardly close' 表示 'forced to close'.
似乎 Application.Terminate
是 "official way",至少在 Delphi 的较新版本中是这样。查看 TPlatformAndroid.Terminate
中的实现,它做了关闭时应该做的事情。
请注意,在 XE5(包括更新包)中,TPlatformAndroid.Terminate
方法是空的。 Delphi XE6 到 XE8 具有设置 IFMXApplicationService.Terminating
to True
, terminating timers and instructing the underlying native activity to finish with a call to ANativeActivity_finish
. Delphi 10 Seattle added to this by triggering TForm.OnSaveState
和 Delphi 的基础知识 10.1 Berlin 采取措施确保所有这些代码 运行 在 FMX 线程中安全。
还有其他选项,其中一些选项有各种缺点。一些看似明显的候选人的缺点是产生运行时间错误(·_·、)
无论如何,如果您愿意,可以尝试以下选项:
- 调用主窗体的
Close
方法 -> 似乎在最新版本中有效 - 调用主窗体的
Release
方法 -> 如果从主窗体方法调用,则生成带有消息 不平衡堆栈或队列操作 的EListError
Release
在 Windows 和 Android 上的行为和实现之间存在显着差异
- 针对主窗体调用
DisposeOf
-> 如果从事件处理程序调用由于其立即效果而产生访问冲突 - 通常不是一个好的结果 - 通过调用
TAndroidHelper.Activity.finish
(依赖于Androidapi.Helpers单元)或[=24=来调用底层Androidactivity的finish
方法](依赖于 FMX.Platform.Android 单元)-> 似乎有效 - 调用
Halt
-> 这是终止应用程序的最粗暴的方式,不推荐这样做:应用程序会突然结束,绕过任何重要的清理代码等。 - 在使用Posix.Pthread、Posix.Unistd和Posix.Signal方法后调用
kill(getpid, SIGKILL)
->另一种极其磨蚀的方法(可能是最磨蚀的),不推荐:该应用程序将绕过任何重要的清理代码等突然结束