Jetpack Compose 中的 onNewIntent。

5

我从其他应用程序接收一些文本,例如如果人们从YouTube应用程序共享视频,我的应用程序将出现在可共享列表中。 如果他们选择了我的应用程序,我想要获取文本内容。

我有一个如下的意图过滤器。

<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:host="*" android:mimeType="text/*" />
</intent-filter>

我可以通过活动中的onNewIntent方法访问数据。

override fun onNewIntent(intent: Intent?) {
    Log.d(TAG, intent?.getStringExtra(Intent.EXTRA_TEXT).toString())
    super.onNewIntent(intent)
}

但我想访问组合函数内部的文本,我该怎么做?

1
你可以在 onNewIntent() 中更新一个活动范围的 ViewModel,并通过 MutableStateStateFlowLiveData 或其他方式使数据可用。然后,您需要将该 ViewModel 传递到根组合(使用 setContent() 设置的组合)中,以便子组合可以观察结果。 - CommonsWare
我的建议是将(最好委托)MutableState属性添加到您的Activity类中,并将其传递到 composable 中。如果使用ViewModel,则必须处理不同的生命周期,因为 ViewModel 倾向于比 Activity 更长久。您通常会希望从 onCreate() 和 onNewIntent() 中设置该属性。 - Uli
1个回答

5

我认为在 setContent 方法中使用一次性效果会起到作用。

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContent {
            DisposableEffect(Unit) {
                val listener = Consumer<Intent> {
                    // logic here
                }
                addOnNewIntentListener(listener)
                onDispose { removeOnNewIntentListener(listener) }
            }
        }
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接