配置生命周期监听器
了解允许 Expo Modules API 钩入你应用生命周期的机制。
一些 Expo 库需要通过实现 Activity/Application 或 AppDelegate 生命周期回调来处理系统事件,例如深度链接、推送通知和配置更改。
🌐 Some Expo libraries need to handle system events such as deep links, push notifications, and configuration changes by implementing Activity/Application or AppDelegate lifecycle callbacks.
Expo 模块 API 提供了一种管理此类回调的简便方式:
🌐 The Expo Modules API provides an easy way to manage such callbacks:
- Android
ApplicationLifecycleDispatcher和ReactActivityHandler会将Application和Activity生命周期事件转发给已注册的监听器。模块可以通过Package类提供ReactActivityLifecycleListener和ApplicationLifecycleListener实现来注册回调。 - iOS
ExpoAppDelegate将AppDelegate调用转发给已注册的订阅者。模块可以提供ExpoAppDelegateSubscriber实现来注册回调。
使用这些机制可以让模块注册行为,而无需你反复编辑本地入口点。
🌐 Using these mechanisms allows modules to register behavior without requiring you to edit native entry points repeatedly.
配置你的本地项目
🌐 Configure your native project
安卓
🌐 Android
要在 Android 上集成 Application 生命周期监听器,请将 Application 类中的 onCreate() 和 onConfigurationChanged() 调用转发到 ApplicationLifecycleDispatcher:
🌐 To integrate Application lifecycle listeners on Android, forward the onCreate() and onConfigurationChanged() calls from your Application class to ApplicationLifecycleDispatcher:
iOS
To integrate AppDelegate subscribers on iOS, forward the relevant calls to ExpoAppDelegateSubscriberManager in your existing AppDelegate implementation so that subscribers can respond to them:
Alternatively, if your AppDelegate doesn't already extend another class, you can simplify the setup by inheriting from ExpoAppDelegate, which handles the forwarding automatically:
Note: Not all
UIApplicationDelegatemethods that could cause significant side effects are supported. See the Expo source (ExpoAppDelegate.swift) for the full list of forwarded methods if you need to rely on a specific delegate.
Test your integration
To test if the callbacks are working correctly, install a module that relies on them. Install expo-linking, which uses lifecycle listeners to handle deep links:
- npx expo install expo-linkingAdd a listener for deep links in your code and observe the console when opening a deep link:
import * as Linking from 'expo-linking'; import { useEffect } from 'react'; useEffect(() => { const listener = Linking.addEventListener('url', ({ url }) => { console.log('Received deep link:', url); }); return listener.remove; }, []);
Run the following command to open a deep link to your app:
# If you have `android.package` or `ios.bundleIdentifier` defined in your app.json- npx uri-scheme open com.example.app://somepath/details --android# If you have a `scheme` defined in your app.json- npx uri-scheme open myapp://somepath/details --ios