gpt4 book ai didi

android - 来自前台服务的 Nav Deep Link

转载 作者:行者123 更新时间:2023-12-05 00:04:19 24 4
gpt4 key购买 nike

我正在尝试从前台服务通知导航到我的导航图中的 fragment 。我使用以下代码创建了一个显式深层链接,但未按预期运行。

val pendingIntent = NavDeepLinkBuilder(this) // this is the Service context!
.setComponentName(MainActivity::class.java)
.setGraph(R.navigation.primary_app_nav)
.setDestination(R.id.shareSheetFragment)
.setArguments(bundle)
.createPendingIntent()

看完guide ,我知道您需要使用 Activity 上下文而不是任何其他上下文(在我的例子中是服务上下文)。

Note that if the provided context is not an Activity, the constructoruses PackageManager.getLaunchIntentForPackage() as the defaultactivity to launch, if available.

我的问题是如何从我的前台服务中获取 MainActivity 上下文?

最佳答案

我仍然没有想出一种使用显式深层链接的方法,但我选择了一种利用隐式深层链接的解决方案。

首先,在导航图 XML 中添加指向您的 fragment 的深层链接。

<deepLink android:id="@+id/deepLink"
app:uri="my-app://com.example.app/hotspot?ssid={ssid}&amp;passkey={passkey}" />

添加 <nav-graph />在您的 <activity /> 中标记在 list 中。这将确保创建所有 Intent 过滤器并将其合并到您的 list 中。

<nav-graph android:value="@navigation/primary_app_nav" />

创建您的 PendingIntent通知如下。

fun getNotificationPendingIntent(ssid: String, passkey: String): PendingIntent {
val uri = Uri.parse("my-app://com.example.app/hotspot?ssid=$ssid&passkey=$passkey")
val bundle = Bundle().apply { putParcelable(SHARE_DEEP_LINK_KEY, uri) }
val intent = Intent(this, SailsActivity::class.java).apply {
putExtras(bundle)
// to clear the back stack
addFlags(FLAG_ACTIVITY_CLEAR_TOP or FLAG_ACTIVITY_SINGLE_TOP
or FLAG_ACTIVITY_CLEAR_TASK or FLAG_ACTIVITY_NEW_TASK)
}
return PendingIntent.getActivity(this, launchShareSheetCode, intent, PendingIntent.FLAG_UPDATE_CURRENT)
}

最后,您需要处理来自 Activity 的深层链接 Intent 类' onCreate()方法。

private fun handleDeepLinkIntent() {
val deepLink = intent.extras?.getParcelable(SHARE_DEEP_LINK_KEY) as? Uri
deepLink?.also {
val intent = Intent(this, SenderService::class.java)
this.bindService(intent, serviceConn, Context.BIND_ABOVE_CLIENT)
navigateDeepLink(it)
}
}

private fun navigateDeepLink(uri: Uri) {
findNavController(R.id.navHostFragment).apply {
if (graph.hasDeepLink(uri))
navigate(uri)
else {
currentDestination?.getAction(id)?.let {
navigate(id)
}
}
}
}

深层链接 URI 参数在目标 fragment 中自动可供您使用。

if (arguments != null) {
val ssid = requireArguments().getString("ssid")
val passkey = requireArguments().getString("passkey")
}

关于android - 来自前台服务的 Nav Deep Link,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64024629/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com