You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android Sticky模式前台服务被异常查杀无预警问题咨询

核心原因

你遇到的无回调被杀问题是Android系统的原生设计逻辑,和Delphi 11.1开发框架没有关系:

  • 主动调用TAndroidHelper.Activity.stopService(LIntent)属于应用主动触发的正常服务生命周期流程,系统会按顺序调度Service的onDestroy等回调,你有充足的时间执行数据保存、资源释放操作。
  • 系统低内存回收、用户手动划掉最近任务两种场景,本质是系统直接向应用进程发送不可拦截、不可捕获的SIGKILL信号,内核会直接回收进程所有内存资源,不会给进程预留任何执行代码的时间窗口,因此不会触发任何应用层的生命周期回调,自然没有提前预警。

注意:部分定制ROM会在用户划掉最近任务时直接将应用加入强制停止列表,后续连Sticky模式的自动重启都会被拦截,这属于ROM定制修改逻辑,不是原生Android的行为。

可落地的适配方案

不存在能100%覆盖所有杀进程场景的预警通知机制,你可以通过以下组合方案尽可能实现优雅关停、数据不丢失:

  • 重写Service的onTaskRemoved回调:这是用户划掉最近任务场景下,原生Android系统唯一会在杀进程前尝试调度的回调,你可以在这个回调中执行关键数据落盘、资源释放操作。需要注意该回调的执行窗口极短(通常不足5秒),不能执行耗时操作;Delphi默认的Service封装没有暴露这个回调,你需要自行派生JService的Java桥接类实现对应方法映射。
  • 注册ComponentCallbacks2监听内存预警:在应用全局、Service中都注册该组件回调,当收到TRIM_MEMORY_RUNNING_CRITICAL、TRIM_MEMORY_BACKGROUND、TRIM_MEMORY_UI_HIDDEN级别的内存trim通知时,立刻主动释放非必要资源、将内存中暂存的关键数据写入本地存储,这是系统低内存回收前唯一会向上层下发的预警信号。
  • 放弃“退出时统一保存”的逻辑,改用增量持久化策略:所有业务关键数据只要产生变更就立刻写入本地存储(数据库、加密文件、键值对存储均可),不要把待保存数据长期存放在内存中等待退出时统一写入,从根源上规避进程突然被杀导致的数据丢失问题——这也是唯一能覆盖所有国产ROM强制杀进程场景的兜底方案。
  • 不要尝试捕获SIGKILL信号:该信号是Linux内核层面规定的不可捕获、不可忽略信号,任何在Java层、Native层尝试捕获该信号做善后逻辑的操作都是无效的。

内容的提问来源于stack exchange,提问作者Bart Kindt

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 21:45:44