如何将Expo原生模块的自定义生命周期监听器绑定到主模块?
问题解决:Expo原生模块中Package类未运行及权限请求集成
核心问题分析
你的MyLibPackage未被Expo识别运行,原因有两点:一是该Package类未关联NativeAudioViewModule,Expo无法感知到它;二是原代码中handleNotificationPermission存在递归调用自身的bug,会直接导致栈溢出。
解决方案步骤
1. 修正Package类,关联模块与生命周期监听器
Expo的Package需要返回模块相关的所有组件(包括Module、生命周期监听器等),修改MyLibPackage如下:
package expo.modules.nativeaudioview import expo.modules.core.interfaces.Package import expo.modules.core.interfaces.ReactActivityLifecycleListener import expo.modules.kotlin.modules.Module import android.content.Context class MyLibPackage : Package { // 返回你的NativeAudioViewModule,让Expo加载该模块 override fun createModules(context: Context): List<Module> { return listOf(NativeAudioViewModule()) } // 提供生命周期监听器实例 override fun createReactActivityLifecycleListeners(activityContext: Context): List<ReactActivityLifecycleListener> { return listOf(MyLibReactActivityLifecycleListener()) } }
2. 修复生命周期监听器的递归bug
删除handleNotificationPermission中调用自身的代码,修正后的完整类代码:
class MyLibReactActivityLifecycleListener : ReactActivityLifecycleListener { private var requestPermissionLauncher: ActivityResultLauncher<String>? = null @RequiresApi(Build.VERSION_CODES.TIRAMISU) override fun onCreate(activity: Activity, savedInstanceState: Bundle?) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { handleNotificationPermission(activity) } } @RequiresApi(Build.VERSION_CODES.TIRAMISU) private fun handleNotificationPermission(activity: Activity) { // 注册权限请求Launcher if (activity is androidx.activity.ComponentActivity) { requestPermissionLauncher = activity.registerForActivityResult( ActivityResultContracts.RequestPermission() ) { isGranted: Boolean -> if (isGranted) { // 权限授予后的逻辑 } else { // 权限拒绝后的用户反馈逻辑 } } } // 检查权限状态并处理 when { ContextCompat.checkSelfPermission( activity, Manifest.permission.POST_NOTIFICATIONS ) == PackageManager.PERMISSION_GRANTED -> { // 权限已存在,无需操作 } ActivityCompat.shouldShowRequestPermissionRationale( activity, Manifest.permission.POST_NOTIFICATIONS) -> { // 向用户解释权限需求(如弹出对话框) } else -> { // 发起权限请求 requestPermissionLauncher?.launch(Manifest.permission.POST_NOTIFICATIONS) } } } }
3. 让Expo识别你的Package
在模块的build.gradle(或build.gradle.kts)文件中添加配置,指定Package类的全限定名:
expo { packageClass = "expo.modules.nativeaudioview.MyLibPackage" }
4. 声明权限到AndroidManifest.xml
在AndroidManifest.xml中添加通知权限声明:
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
内容的提问来源于stack exchange,提问作者KAT
相关产品推荐
相关产品推荐

