You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 22:30:59