我希望我的库在没有主代码显式调用它的情况下启动 activity

I want my library to start an activity without the main code explictly calling it

我正在开发一个有几个现成活动的图书馆。

到目前为止,我在图书馆和主应用程序中有我的活动,我通常用 registerForActivityResult 调用它来启动它。

这意味着使用我的图书馆的任何人都能够看到整个 activity。

我想做的是让开发人员调用库 class 中的方法并要求它执行操作,然后在库中该方法将自行启动 activity,注册为result,return结果通过接口class调用

下面是我尝试过的,但它给我错误 LifecycleOwner is attempting to register while current state is RESUMED. LifecycleOwners must call register before they are STARTED

private fun launchScannerActivity(activity: FragmentActivity, callback: ScannerCallback) {
        val scanResult =
            activity.registerForActivityResult(
                ActivityResultContracts.StartActivityForResult()
            ) {
                if (it.resultCode == Activity.RESULT_OK) {
                    callback.onResult(it.data?.getStringExtra("Some Key") ?: "")
                } else {
                    callback.onFail()
                }
            }

        val intent = Intent(activity, ScannerActivity::class.java)
        scanResult.launch(intent);
    }

为什么我需要这个: 该库将是 SAAS 产品的 SDK,因此我们希望从客户那里尽可能多地抽象和混淆实现。

您无法使用接口在 Activity 之间进行真正的通信,至少不能以某种简洁且不太容易泄漏的方式进行通信。您可以做的是公开您自己的 Activity 结果合同。那么您的 API 可能会像 ActivityResultContracts 中的一些一样简单。您可以查看那里的源代码以了解如何实现它。

也许是这样的:

class ScannerResultContract : ActivityResultContract<Unit, String?>() {
    override fun createIntent(context: Context, input: Unit?): Intent {
        return Intent(context, ScannerActivity::class.java)
    }

    override fun parseResult(resultCode: Int, intent: Intent?): String? {
        return if (resultCode == Activity.RESULT_OK) {
            intent?.getStringExtra("Some Key")
        } else {
            null
        }
    }
}

客户端使用情况:

// In activity or fragment:
val getScannerResult = registerForActivityResult(ScannerResultContract()) { resultString ->
    if (resultString != null) {
        // use it
    } else {
        // log no result returned
    }
}

//elsewhere:
someListener.setOnClickListener {
    getScannerResult.launch()
}