带有导航库的Android App静态快捷方式

the*_*ani 3 android kotlin android-appshortcut android-architecture-components android-jetpack

我的应用程序有一个静态快捷方式,我正在使用导航体系结构组件。

我正在使用以下实现,但在Android 9上不起作用。

在我的MainActivity中:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    setupToolbar()
    setupNavigationDrawer()

    checkPermissions()

    if (intent.action == MoneyBook.SHORTCUT_ACTION_ADD_BOOKENTRY) {
        findNavController(R.id.nav_host_fragment).popBackStack(R.id.action_entriesFragment_to_newBookEntryFragment, false)
    }
}
Run Code Online (Sandbox Code Playgroud)

shortcuts.xml:

<shortcuts xmlns:android="http://schemas.android.com/apk/res/android">
    <shortcut
        android:enabled="true"
        android:icon="@drawable/ic_shortcut_addbookentry"
        android:shortcutId="shortcut_addbookentry"
        android:shortcutLongLabel="@string/shortcut_addbookentry_label_short"
        android:shortcutShortLabel="@string/shortcut_addbookentry_label_short">

        <intent
            android:action="at.guger.moneybook.action.ADD_BOOKENTRY"
            android:targetClass="at.guger.moneybook.activity.MainActivity"
            android:targetPackage="at.guger.moneybook.dev" />
    </shortcut>
</shortcuts>
Run Code Online (Sandbox Code Playgroud)

在调试应用程序时,我注意到该findNavController(...)方法已调用,但屏幕上没有任何反应。

此外,我不会覆盖onStart(...)onResume(...)

有没有给定的方法来通过导航组件实现应用程序快捷方式,或者我在这里做错了什么?

ian*_*ake 6

导航不支持intent.action单独进行深层链接。但是,可以将一个android:data元素添加到您的<intent>元素,然后将一个隐式深层链接添加到导航图。这样,您就不必编写任何用于处理Intent的特定代码。

例如,将更shortcuts.xml改为添加android:data属性:

<intent
        android:action="at.guger.moneybook.action.ADD_BOOKENTRY"
        android:targetClass="at.guger.moneybook.activity.MainActivity"
        android:targetPackage="at.guger.moneybook.dev"
        android:data="moneybook://add_book_entry" />
Run Code Online (Sandbox Code Playgroud)

在您的导航图XML文件中,<deepLink>为同一URL 添加一个元素:

<fragment
  android:id="@+id/add_book_entry_fragment"
  android:name=".AddBookEntryFragment">
  <deepLink app:uri="moneybook://add_book_entry" />
</fragment>
Run Code Online (Sandbox Code Playgroud)