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
相关产品推荐
相关产品推荐

