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)->另一种极其磨蚀的方法(可能是最磨蚀的),不推荐:该应用程序将绕过任何重要的清理代码等突然结束