Android平台React Native应用进入多任务视图的事件捕获
React Native 捕获最近任务按钮事件与应用销毁前事件
一、捕获按下“最近任务”按钮进入后台概览的事件
按下“最近任务”按钮本质是将应用从前台切换到后台,React Native 自带的AppState API 可以监听这个状态变化:
- 当应用状态从
active(前台活跃)变为background(后台)时,即可触发对应逻辑。不过这个事件无法区分是通过Home键还是最近任务按钮触发的后台切换,只能识别状态变更。 - 代码示例:
import { AppState, useEffect } from 'react-native'; function App() { useEffect(() => { const handleAppStateChange = (nextState) => { if (nextState === 'background') { // 处理进入后台概览的逻辑 console.log('应用进入后台概览界面'); } }; AppState.addEventListener('change', handleAppStateChange); // 组件卸载时移除监听 return () => { AppState.removeEventListener('change', handleAppStateChange); }; }, []); return ( // 你的应用组件 ); }
二、应用被销毁前的事件捕获
React Native 层面没有提供直接的“销毁前”回调,因为 iOS 和 Android 的应用销毁机制存在差异,且系统可能在无通知的情况下直接终止进程:
iOS 端
- 当应用在后台被系统终止或用户从后台概览滑动删除时,原生
AppDelegate中的applicationWillTerminate:方法会触发(仅后台终止场景有效,前台被杀死不触发)。你需要通过原生代码扩展,将这个事件传递给 RN 端:- 在
AppDelegate.m中添加逻辑:
- (void)applicationWillTerminate:(UIApplication *)application { // 发送事件给RN [[NSNotificationCenter defaultCenter] postNotificationName:@"AppWillTerminate" object:nil]; }- 在 RN 端通过
NativeEventEmitter监听:
import { NativeEventEmitter, NativeModules } from 'react-native'; const eventEmitter = new NativeEventEmitter(NativeModules.NotificationCenter); useEffect(() => { const subscription = eventEmitter.addListener('AppWillTerminate', () => { console.log('应用即将被销毁(iOS)'); // 执行收尾逻辑 }); return () => { subscription.remove(); }; }, []); - 在
Android 端
- 应用被销毁时,原生
Activity的onDestroy方法会触发。同样需要通过自定义原生模块将事件传递给 RN:- 创建自定义原生模块,在
onHostDestroy中发送事件:
public class AppModule extends ReactContextBaseJavaModule { public AppModule(ReactApplicationContext reactContext) { super(reactContext); } @Override public String getName() { return "AppModule"; } @Override public void onHostDestroy() { super.onHostDestroy(); // 发送事件给RN getReactApplicationContext() .getJSModule(DeviceEventManagerModule.RCTDeviceEventEmitter.class) .emit("AppWillDestroy", null); } }- 在 RN 端监听事件:
import { NativeEventEmitter, NativeModules } from 'react-native'; const { AppModule } = NativeModules; const eventEmitter = new NativeEventEmitter(AppModule); useEffect(() => { const subscription = eventEmitter.addListener('AppWillDestroy', () => { console.log('应用即将被销毁(Android)'); // 执行收尾逻辑 }); return () => { subscription.remove(); }; }, []); - 创建自定义原生模块,在
关键注意事项
无论 iOS 还是 Android,系统都可能在极端情况下(如内存严重不足)直接杀死应用进程,不会触发任何销毁前事件。因此不要依赖这类事件处理关键数据持久化,建议在数据变更时即时保存。
内容的提问来源于stack exchange,提问作者Olly Rennard
相关产品推荐
相关产品推荐

