如何订阅应用程序状态切换事件以响应用户操作?
监听应用状态变更的实现方案
分Android和iOS两个平台给你讲具体的订阅方法,都是日常开发里最常用的方案:
Android 平台
1. 监听应用切出/切回
- 全局应用级监听:用
ProcessLifecycleOwner(属于Jetpack Lifecycle组件),能监听整个应用的前后台状态,不用在每个Activity里重复写逻辑:// 在Application类里初始化 ProcessLifecycleOwner.get().lifecycle.addObserver(object : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE) fun onAppBackgrounded() { // 应用被切到后台(切换至其他应用) } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onAppForegrounded() { // 应用回到前台(返回本应用) } }) - 单Activity级监听:如果只需要监听某个页面的切出/切回,直接重写Activity的生命周期方法:
override fun onPause() { super.onPause() // 当前Activity被切到后台(可能是切应用,也可能是跳转到其他Activity) } override fun onResume() { super.onResume() // 当前Activity回到前台 }
2. 监听应用关闭尝试
- 用户按返回键关闭:重写Activity的
onBackPressed(或用OnBackPressedDispatcher):override fun onBackPressed() { // 用户尝试按返回键关闭页面/应用 // 这里可以做拦截或处理逻辑 super.onBackPressed() // 注释掉这行可以阻止关闭 } - 应用被销毁(包括最近任务栏划掉):用
ProcessLifecycleOwner的ON_DESTROY事件,或者重写Application的onTerminate(注意:onTerminate在真实设备上不一定会被调用,因为系统可能直接杀进程):@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY) fun onAppDestroyed() { // 应用即将被销毁 }
iOS 平台
1. 监听应用切出/切回
通过UIApplication的通知来订阅状态变更,在ViewController或AppDelegate里注册:
// 在viewDidLoad里注册通知 override func viewDidLoad() { super.viewDidLoad() // 监听应用即将进入后台(切至其他应用) NotificationCenter.default.addObserver(self, selector: #selector(appWillResignActive), name: UIApplication.willResignActiveNotification, object: nil) // 监听应用回到前台(返回本应用) NotificationCenter.default.addObserver(self, selector: #selector(appDidBecomeActive), name: UIApplication.didBecomeActiveNotification, object: nil) } // 回调方法 @objc func appWillResignActive() { // 应用被切到后台 } @objc func appDidBecomeActive() { // 应用回到前台 } // 别忘了在deinit里移除观察者 deinit { NotificationCenter.default.removeObserver(self) }
2. 监听应用关闭尝试
- 用户主动关闭应用:在AppDelegate(或SceneDelegate,针对多场景应用)里实现对应方法:
// AppDelegate func applicationWillTerminate(_ application: UIApplication) { // 应用即将被终止(用户主动关闭) // 这里可以做清理或保存逻辑 } // 如果用SceneDelegate func sceneWillTerminate(_ scene: UIScene) { // 当前场景即将被终止 } - 注意:iOS中如果应用进入后台后被系统内存不足杀死,
applicationWillTerminate不会被调用,这种情况只能在applicationDidEnterBackground里提前做好状态保存。
内容的提问来源于stack exchange,提问作者YGranja
相关产品推荐
相关产品推荐

