android - delphi如何在android下强制关闭应用程序

标签 android delphi firemonkey

他们是 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/

相关文章:

delphi - firemonkey 表单上的 WS_EX_TRANSPARENT

delphi - 如何在Delphi XE8中处理TListBox一直向下滚动到最后一个TListBoxItem?

mysql - Node.js 服务器(移动客户端)

delphi - 自动化不同本地化版本的 Excel 时如何正确设置 NumberFormat 属性

android - map() 和 switchMap() 方法有什么区别?

android - 为 Google Maps API v2 Android 发布流媒体指示

android - 添加时的 Mapbox 导航包在 gradle 构建中显示错误。

Delphi 检测 Indy 客户端组件的本地端口

delphi - 在 Delphi 中进行异步套接字编程的惯用方法是什么?

android - 将动态线性布局添加到 ListView