如何解决使用导航组件支持隐式和显式深层链接
我正在使用导航组件,当用户点击通知时,我试图触发到特定目的地的显式深层链接,由 Fragment 表示。
根据 documentation,可以像这样创建待处理的意图:
val bundle = bundleOf("id" to "1234")
val pendingIntent = NavDeepLinkBuilder(context)
.setGraph(R.navigation.nav_graph)
.setDestination(R.id.myDestination)
.setArguments(args)
.createPendingIntent()
其中 nav_graph 定义如下:
<fragment
android:id="@+id/myDestination"
android:name="MyFragment">
<argument
android:name="id"
app:argType="string" />
<deepLink app:uri="myApp://myFragment?id={id}" /> // Removing this line it works fine
</fragment>
然后我将使用 NotificationCompat.Builder
with:
.setContentIntent(pendingIntent)
当我点击通知时,正确的目的地实际上已打开,但值 args.id
将为“null”(不是 null
,而是具有“null”值的字符串。在我的片段中,我有
private val args by navArgs<MyFragmentArgs>()
...
override fun onCreate(saveInstanceState: Bundle?) {
args.id // The string value is "null".
}
但是,如果我从片段中删除 <deepLink>
,那么它将起作用。问题是我需要隐式和显式深层链接。有没有办法同时支持导航组件?
解决方法
val bundle = bundleOf("id" to "1234")
val pendingIntent = NavDeepLinkBuilder(context)
.setGraph(R.navigation.nav_graph)
.setDestination(R.id.myDestination)
.setArguments(args)
.createPendingIntent()
您的 args
变量是什么,因为您在上面声明了 bundle
?
我已经检查过,所有代码都运行良好。
我的导航图:
<fragment
android:id="@+id/navigation_notifications"
android:name="com.olopa.thefirst.ui.notifications.NotificationsFragment"
android:label="@string/title_notifications"
tools:layout="@layout/fragment_notifications">
<deepLink app:uri="sampleapp://noti?id={id}" />
<argument
android:name="id"
app:argType="string"
app:nullable="true" />
当通过通知导航时:
val bundle = bundleOf("id" to "12")
val pendingIntent = NavDeepLinkBuilder(this)
.setGraph(R.navigation.mobile_navigation)
.setDestination(R.id.navigation_notifications)
.setArguments(bundle)
.createPendingIntent()
或通过链接导航:
navController.navigate(Uri.parse("sampleapp://noti?id=1"))
,
试试这个方法:
<fragment
android:id="@+id/navigation_notifications"
android:name="NotificationsFragment">
<deepLink app:uri="sampleapp://app/noti?id={id}" /> // host and path is required
<argument
android:name="id"
app:argType="string"
app:nullable="true" />
</fragment>
通过 (source) 在 AndroidManifest.xml 中注册深层链接
<activity
android:name=".MainActivity"
android:exported="true"
android:label="@string/app_name">
<nav-graph android:value="@navigation/mobile_navigation" />
// other intent filters
</activity>
并创建隐式待定意图:
val intent = Intent(Intent.ACTION_VIEW).apply {
data = "sampleapp://app/noti?id=fromNotif".toUri()
flags = Intent.FLAG_ACTIVITY_NEW_TASK
}
val pendingIntent = PendingIntent.getActivity(context,id,intent,flags)
val notification = NotificationCompat.Builder(context,channelName)
// ...
.setContentIntent(pendingIntent)
.build()
到目前为止,它将启动 MainActivity
。
如果您在其 xml 布局中使用 <fragment>
,它将自动在 NotificationsFragment
上导航。
<fragment
android:id="@+id/nav_host_fragment_activity_main"
android:name="androidx.navigation.fragment.NavHostFragment"
app:defaultNavHost="true"
app:navGraph="@navigation/mobile_navigation" />
否则请自行处理:
if (intent.action == Intent.ACTION_VIEW && intent.data != null)
navController.navigate(intent.data!!)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。