Firemonkey如何检测Android/iOS系统关机及应用被后台清除事件
Delphi 10.4 FireMonkey 安卓端关机/任务列表划杀应用检测方案
1. 系统关机/重启事件检测
安卓系统触发关机/重启时会发送全局广播,可通过动态注册广播接收器捕获该事件,FireMonkey 原生窗体事件不会响应这类系统级行为,实现步骤如下:
- 引入必要单元:
Androidapi.JNI.GraphicsContentViewText、Androidapi.JNI.Os、Androidapi.Helpers、System.Android.BroadcastReceiver - 自定义关机广播接收器
type TShutdownReceiver = class(TBroadcastReceiver) protected procedure OnReceive(Context: JContext; Intent: JIntent); override; end; procedure TShutdownReceiver.OnReceive(Context: JContext; Intent: JIntent); begin if (Intent.getAction.equals(TJIntent.JavaClass.ACTION_SHUTDOWN)) or (Intent.getAction.equals(TJIntent.JavaClass.ACTION_REBOOT)) then begin // 此处写入关机前需要执行的逻辑,如数据保存、资源释放 // 注意:此处执行时间不能超过10s,否则会被系统强制终止 end; end;
- 应用启动时动态注册接收器,建议在主窗体
OnCreate事件中执行:
var Filter: JIntentFilter; FShutdownReceiver: TShutdownReceiver; begin FShutdownReceiver := TShutdownReceiver.Create(nil); Filter := TJIntentFilter.Create; Filter.addAction(TJIntent.JavaClass.ACTION_SHUTDOWN); Filter.addAction(TJIntent.JavaClass.ACTION_REBOOT); TAndroidHelper.Context.registerReceiver(FShutdownReceiver, Filter); end;
注意:安卓7.0及以上系统禁止静态注册关机广播,仅支持动态注册,无需额外申请权限。
2. 最近任务列表手动划杀应用检测
用户从最近任务列表关闭应用时,安卓会直接销毁应用主进程,常规窗体生命周期事件不会触发,可通过自定义前台服务的onTaskRemoved回调捕获该行为:
- 首先在工程中添加安卓服务,重写服务的
OnTaskRemoved方法:
type TAppTaskService = class(TAndroidService) procedure AndroidServiceTaskRemoved(Service: TAndroidService; Intent: JIntent); end; procedure TAppTaskService.AndroidServiceTaskRemoved(Service: TAndroidService; Intent: JIntent); begin // 此处写入应用被划杀前需要执行的逻辑 // 执行完成后调用stopSelf停止服务 Service.stopSelf(Service.ServiceId); end;
- 在应用启动时启动前台服务,安卓8.0及以上需要申请前台服务权限,在 manifest 中添加:
<uses-permission android:name="android.permission.FOREGROUND_SERVICE" />
注意:服务需设置为前台服务,否则后台服务会被系统随机回收,无法保证回调触发;回调中仅可执行轻量操作,不可调用主进程UI相关代码。
通用注意事项
- 以上两个场景的回调执行时间都被系统严格限制,仅可执行数据持久化、状态保存等轻量操作,耗时操作会被系统强制打断无法执行完成
- FireMonkey原生的
OnCloseQuery、OnClose、OnDestroy事件仅在应用主动调用Close、Terminate方法退出时触发,不响应系统主动销毁进程的场景
内容的提问来源于stack exchange,提问作者LUIS A. GAMA
相关产品推荐
相关产品推荐

