如何使用导航组件创建固定快捷方式?
How to create pinned shortcut with navigation components?
所以我关注了 Chet Haase 的文章。
文章:https://medium.com/androiddevelopers/navigating-with-deep-links-910a4a6588c
在本文中,他解释了如何使用带有导航组件的深层链接。固定的快捷方式构建器需要一个 Intent,但 findNavController 辅助方法 returns PendingIntent 的对象。
文章中获取pendingIntent的方法。
val pendingIntent = navController
.createDeepLink()
.setDestination(R.id.donutEntryDialogFragment)
.setArguments(arg)
.createPendingIntent()
ShortcutInfoBuilder 方法
val pinShortcutBuilder = ShortcutInfo.Builder(
requireContext(),
"id"
)
pinShortcutBuilder
.setShortLabel("someLabel")
.setIntent(intent) // takes an object of Intent
那么,如何创建固定快捷方式?
我们使用 URI 创建深层链接,Intent 构造函数的参数之一是 URI。我们可以直接将 URI 传递给构造函数并将 activity 设置为 MainActity(因为单个 activity 范例)。
val intent = Intent(
Intent.ACTION_VIEW,
"myapp://navdonutcreator.com/donutcreator".toUri(),
requireContext(),
MainActivity::class.java
)
现在在您要打开的片段中使用相同的 URI。
<fragment
android:id="@+id/targetFragment"
android:name="com.example.myapp.ui.TargetFragment"
tools:layout="@layout/fragment_target">
<deepLink
android:id="@+id/deepLink"
app:uri="myapp://navdonutcreator.com/donutcreator" />
</fragment>
现在把所有东西缝合起来,
val shortcutManager = ContextCompat.getSystemService(
requireContext(),
ShortcutManager::class.java
)
if (shortcutManager != null && shortcutManager.isRequestPinShortcutSupported) {
val intent = Intent(
Intent.ACTION_VIEW,
"myapp://navdonutcreator.com/donutcreator".toUri(),
requireContext(),
MainActivity::class.java
)
val pinShortcutBuilder =
ShortcutInfo.Builder(
requireContext(),
"someId"
)
pinShortcutBuilder.setShortLabel("someLabel)
.setIntent(intent)
val pinShortcutInfo = pinShortcutBuilder.build()
// Create the PendingIntent object only if your app needs to be notified
// that the user allowed the shortcut to be pinned. Note that, if the
// pinning operation fails, your app isn't notified. We assume here that the
// app has implemented a method called createShortcutResultIntent() that
// returns a broadcast intent.
val pinnedShortcutCallbackIntent =
shortcutManager.createShortcutResultIntent(pinShortcutInfo)
// Configure the intent so that your app's broadcast receiver gets
// the callback successfully.For details, see PendingIntent.getBroadcast().
val successCallback = PendingIntent.getBroadcast(
requireContext(), 0,
pinnedShortcutCallbackIntent, 0
)
shortcutManager.requestPinShortcut(
pinShortcutInfo,
successCallback.intentSender
)
}
编辑
Android 快捷方式文档:https://developer.android.com/guide/topics/ui/shortcuts/creating-shortcuts
所以我关注了 Chet Haase 的文章。
文章:https://medium.com/androiddevelopers/navigating-with-deep-links-910a4a6588c
在本文中,他解释了如何使用带有导航组件的深层链接。固定的快捷方式构建器需要一个 Intent,但 findNavController 辅助方法 returns PendingIntent 的对象。
文章中获取pendingIntent的方法。
val pendingIntent = navController
.createDeepLink()
.setDestination(R.id.donutEntryDialogFragment)
.setArguments(arg)
.createPendingIntent()
ShortcutInfoBuilder 方法
val pinShortcutBuilder = ShortcutInfo.Builder(
requireContext(),
"id"
)
pinShortcutBuilder
.setShortLabel("someLabel")
.setIntent(intent) // takes an object of Intent
那么,如何创建固定快捷方式?
我们使用 URI 创建深层链接,Intent 构造函数的参数之一是 URI。我们可以直接将 URI 传递给构造函数并将 activity 设置为 MainActity(因为单个 activity 范例)。
val intent = Intent(
Intent.ACTION_VIEW,
"myapp://navdonutcreator.com/donutcreator".toUri(),
requireContext(),
MainActivity::class.java
)
现在在您要打开的片段中使用相同的 URI。
<fragment
android:id="@+id/targetFragment"
android:name="com.example.myapp.ui.TargetFragment"
tools:layout="@layout/fragment_target">
<deepLink
android:id="@+id/deepLink"
app:uri="myapp://navdonutcreator.com/donutcreator" />
</fragment>
现在把所有东西缝合起来,
val shortcutManager = ContextCompat.getSystemService(
requireContext(),
ShortcutManager::class.java
)
if (shortcutManager != null && shortcutManager.isRequestPinShortcutSupported) {
val intent = Intent(
Intent.ACTION_VIEW,
"myapp://navdonutcreator.com/donutcreator".toUri(),
requireContext(),
MainActivity::class.java
)
val pinShortcutBuilder =
ShortcutInfo.Builder(
requireContext(),
"someId"
)
pinShortcutBuilder.setShortLabel("someLabel)
.setIntent(intent)
val pinShortcutInfo = pinShortcutBuilder.build()
// Create the PendingIntent object only if your app needs to be notified
// that the user allowed the shortcut to be pinned. Note that, if the
// pinning operation fails, your app isn't notified. We assume here that the
// app has implemented a method called createShortcutResultIntent() that
// returns a broadcast intent.
val pinnedShortcutCallbackIntent =
shortcutManager.createShortcutResultIntent(pinShortcutInfo)
// Configure the intent so that your app's broadcast receiver gets
// the callback successfully.For details, see PendingIntent.getBroadcast().
val successCallback = PendingIntent.getBroadcast(
requireContext(), 0,
pinnedShortcutCallbackIntent, 0
)
shortcutManager.requestPinShortcut(
pinShortcutInfo,
successCallback.intentSender
)
}
编辑
Android 快捷方式文档:https://developer.android.com/guide/topics/ui/shortcuts/creating-shortcuts