关于android:使用深层链接导航-MAD-Skills

20次阅读

共计 4962 个字符,预计需要花费 13 分钟才能阅读完成。

这是一个新的系列文章,咱们称之为 “Modern Android Development 技巧 ”,简称为 “MAD Skills”。本系列文章致力于帮忙开发者们打造更好的古代 Android 开发体验,敬请关注。

明天为大家公布本系列文章中的第四篇: 应用深层链接 (Deep Links) 导航。如果您想回顾过去公布的内容,请参考上面链接查看:

  • 导航组件概览
  • 导航到对话框
  • 在利用中导航时应用 SafeArgs

介绍

这篇文章的内容是对于 深层链接 的,导航 (Navigation) 组件提供了该性能以帮忙用户从利用的内部达到利用的深层页面。

有时您会想让用户更便捷地达到利用流程中指定的页面,而不用从初始页始终一直地点击来跳转到那个页面。比方在聊天利用中间接显示正在进行的对话详情页,再比方购物利用中用户的购物车详情页。您能够应用深层链接来实现上述需要,通过点击相似快捷方式和告诉等利用的内部链接来达到您利用的深层页面。

导航组件简化了这些深层链接的创立步骤。为了展现其工作原理,咱们将再次回顾我在 以前文章 中应用的甜甜圈记录利用。该利用的 残缺代码 公布在 Github 上,请下载并应用 Android Studio 关上。

代码曾经实现,所以我将会逐渐解释如何利用导航组件来实现深层链接。

甜甜圈深层链接

在甜甜圈记录利用中,有几个操作如果能疾速达到会十分不便。比方我忽然发现一个十分不错的甜甜圈,并心愿能疾速地将其信息记录到列表中,然而我并不想启动利用,再点击 FloatingActionButton 按钮来弹出数据输出对话框。再比方我正在新增或者编辑一个甜甜圈的信息,心愿利用可能发送一个告诉,这样我就能疾速地编辑最近的这个条目。

我为这两个操作都增加了深层链接,一个是为了增加新的甜甜圈,而另一个是为了返回正在编辑的条目。这个 “ 新增 ” 操作应用的是 “ 隐式 ” 深层链接,隐式 意味着这个深层链接会带用户到您利用层次结构中的一个固定页面,这个地位也不会随着工夫而扭转。在我的利用中,该隐式深层链接会始终带您到容许在列表中增加新甜甜圈的表单页。

“ 持续编辑 ” 操作应用的是 “ 显式 ” 深层链接,显式的意思是咱们调用这个深层链接能够带用户到您利用中的一个动静页面。

创立隐式深层链接

咱们来先创立新增甜甜圈表单页的隐式深层链接。

首先,我须要应用导航编辑器来创立这个深层链接。点击对话框目的地能够在左边显示这个目的地页面的属性:

点击目的地能够显示其属性,咱们能够在属性栏中创立一个新的深层链接来导航到这个目的地

点击 Deep Links (深层链接) 旁边的 + 来关上一个对话框,在这个对话框中,我输出了一个 URI (Universal Resource Identifier)。这里咱们须要一个利用特有的 URI (而不能是一个通用的 web 地址,不然它会触发浏览器利用),所以我应用了咱们利用特有的 “myapp” 作为标识符:

创立一个新的深层链接会关上一个对话框,您能够在这输出一个跳转到该目的地的深层链接 URI

接下来,我通过编辑利用的 manifest 文件来告诉利用为深层链接创立一个快捷方式:

<activity
    android:name="com.android.samples.donuttracker.MainActivity"
    android:label="@string/app_name"
    android:theme="@style/AppTheme.NoActionBar">
  <nav-graph android:value="@navigation/nav_graph" />
   <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
   <meta-data android:name="android.app.shortcuts"
        android:resource="@xml/shortcuts" />
</activity>

在 meta-data 代码块中,我通知 activity 对于该深层链接在导航图中的信息。同时我也援用了一个 xml 资源文件夹中的新文件,这个文件蕴含了达到该 activity 利用快捷方式的信息。

而后我又创立了 xml 文件夹,并且在其中新创建了一个 shortcuts.xml 文件。在这个快捷方式文件中,我输出了对于这个利用快捷方式的信息,包含下面咱们看到的 URI:

<shortcuts
    xmlns:android="http://schemas.android.com/apk/res/android">
  <shortcut
    android:shortcutId="NewDonutDialogFragment"
    android:enabled="true"
    android:shortcutShortLabel="@string/static_shortcut_label_short"
    android:shortcutLongLabel="@string/static_shortcut_label_long"
    android:shortcutDisabledMessage=
        "@string/static_shortcut_disabled_message"
    android:icon="@drawable/donut_with_sprinkles">
    <intent
       android:action="android.intent.action.VIEW"
      android:data="myapp://navdonutcreator.com/donutcreator" />
 </shortcut>
</shortcuts>

最重要的局部是 data 字段,它的值是在之前导航工具深层链接对话框中输出的 URI,这也是从利用快捷方式导航到对话框目的地的纽带。

以上内容就是创立一个隐式深层链接所需的操作,我申明了要导航的目的地,并且创立了一个快捷方式来实现导航。如果运行这个利用并长按这个利用的图标,您会看到这个快捷方式,点击这个快捷方式会带您到能够创立新甜甜圈的表单页。

下面介绍的是隐式深层链接,接下来咱们来创立一个显式深层链接,这个链接会依据利用的状态动静地被创立。

创立显式深层链接

如果您像我一样,甜甜圈在您的生存里也十分重要,因而当我输出一个新发现的甜甜圈信息时,可能想慢慢来,我可能会先输出一部分信息,当我有机会享受后再回来缓缓补充其余残余信息。

这能够应用告诉来实现,当我输出一个甜甜圈信息的时候,利用会创立一个告诉以便之后能够快捷地返回正在编辑的条目。这其实不须要太多的代码来实现,只有创立一个带 PendingIntent 的告诉,就能够带咱们返回利用的正确页面。

下面的逻辑大部分产生在 DonutEntryDialogFragment 中,在 Done 按钮的 onClick() 监听器回调函数中。咱们曾经在 之前的文章 中介绍过这个点击监听器的代码,咱们能够在这里新增和更新 ViewModel 的数据。我只须要再增加创立告诉这一步,如下代码所示:

binding.doneButton.setOnClickListener {
    // 先获取上下文参数,因为 Fragment 可能在上面的 lambda 调用前就隐没了
    val context = requireContext().applicationContext
    val navController = findNavController()

    donutEntryViewModel.addData(
        donut?.id ?: 0,
        binding.name.text.toString(),
        binding.description.text.toString(),
        binding.ratingBar.rating.toInt()) { actualId ->
        val arg = DonutEntryDialogFragmentArgs(actualId).toBundle()
        val pendingIntent = navController
            .createDeepLink()
            .setDestination(R.id.*donutEntryDialogFragment*)
            .setArguments(arg)
            .createPendingIntent()

        Notifier.postNotification(actualId, context, pendingIntent)
    }
    dismiss()}

首先,代码创立了带甜甜圈 id 的参数 arg,能够用这个参数来通知目的地对话框应该获取哪个甜甜圈信息,来让用户持续编辑。

代码应用了一个 NavigationController 的 API 为深层链接创立 pendingIntent,其目的地被设置为对话框 fragment,这个调用既设置了包含甜甜圈 ID 的参数也创立了 intent。

代码还调用了 Notifer.postNotification(),这是我为了解决告诉的创立和发送操作而减少的一个工具类办法。

fun postNotification(id: Long, 
                     context: Context, 
                     intent: PendingIntent) {val builder = NotificationCompat.Builder(context, channelId)
    builder.setContentTitle(context
            .getString(R.string.deepLinkNotificationTitle))
        .setSmallIcon(R.drawable.donut_with_sprinkles)
    val text = context.getString(R.string.addDonutInfo)
    val notification = builder.setContentText(text)
        .setPriority(NotificationCompat.PRIORITY_HIGH)
        .setContentIntent(intent)
        .setAutoCancel(true)
        .build()
    val notificationManager =
        NotificationManagerCompat.from(context)
    notificationManager.cancelAll()
    notificationManager.notify(id.toInt(), notification)
}

首先,这段代码会创立一个 notification builder,而初始化这个 builder 须要一个 channelId,这一初始化过程须要放在 Notifierinit() 办法中 (想理解这些细节,请查阅代码,这也是规范做法)。

接下来,我设置了告诉所须要的其余数据,同时设置了 intent,而后构建这个告诉。在发送这个告诉之前,已存在的告诉会被勾销 (因为我只想编辑最近的甜甜圈)。

最初,新创建的告诉被发送进去,功败垂成。当初每一个新编辑 (无论是创立新甜甜圈,还是编辑已存在的甜甜圈) 都会生成一个告诉,之后用户能够点击这个告诉,回到这个正在编辑的操作中。

总结

在这篇文章中,我先是创立了一个 隐式 深层链接,这个链接能够带用户进入利用的一个固定页面,用户能够在这个页面输出新甜甜圈的信息。接着,我创立了一个 显式 深层链接,这个链接能够帮忙用户返回其之前没有实现的甜甜圈编辑页面。

甜甜圈记录利用变得越来越好了,不过当然还是不如甜甜圈好,因为什么都不如甜甜圈。这次就到这了,去找个甜甜圈享受吧,这是您应得的。

更多信息

更多对于导航组件的详情,请查看导航组件应用 入门文档。

DonutTracker 利用的残缺代码,请查看 Github 示例。

更多古代 Android 开发技巧 (MAD Skills) 系列内容,请查看 Android Developers 频道。

感激各位中国 Android 开发者敌人们的一路相伴,咱们始终以来都非常重视您的声音,大家的想法和倡议咱们也都驳回并施行在产品和日常工作中。咱们邀请您扫描下方二维码,向 “Android 开发者 ” 公众号分享您的倡议和对咱们的期待。

正文完
 0