导航控制器和广播接收器

Nei*_*eil 5 android broadcastreceiver navigationcontroller

NavigationController我目前在从上​​下文中查找实例时遇到问题BroadcastReceiver。当我findNavigationController()从其他任何地方调用Fragment它时,它导航没有任何问题,但是当我从以下上下文中调用它时onReceive应用程序的上下文中调用它时,它会崩溃并出现以下异常

\n\n
 Caused by: java.lang.IllegalArgumentException: navigation destination app.eventcloud.events:id/action_documents_list_fragment_to_document_viewer_fragment is unknown to this NavController\n    at androidx.navigation.NavController.navigate(NavController.java:633)\n    at androidx.navigation.NavController.navigate(NavController.java:592)\n    at app.eventcloud.root.gui.screens.knowledgehub.DocumentsListFragment.handleDownloadCompleted(DocumentsListFragment.kt:97)\n    at app.eventcloud.root.gui.screens.knowledgehub.DocumentsListFragment.access$handleDownloadCompleted(DocumentsListFragment.kt:26)\n    at app.eventcloud.root.gui.screens.knowledgehub.DocumentsListFragment$receiver$1.onReceive(DocumentsListFragment.kt:143)\n    at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1391)\n    at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2)\xc2\xa0\n    at android.os.Handler.handleCallback(Handler.java:873)\xc2\xa0\n    at android.os.Handler.dispatchMessage(Handler.java:99)\xc2\xa0\n    at android.os.Looper.loop(Looper.java:193)\xc2\xa0\n    at android.app.ActivityThread.main(ActivityThread.java:6669)\xc2\xa0\n    at java.lang.reflect.Method.invoke(Native Method)\xc2\xa0\n    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)\xc2\xa0\n    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)\xc2\xa0\n
Run Code Online (Sandbox Code Playgroud)\n\n

导致问题的代码如下。

\n\n
private val receiver: BroadcastReceiver = object : BroadcastReceiver() {\n    override fun onReceive(context: Context, intent: Intent) {\n        val action = intent.action\n        if (DownloadManager.ACTION_DOWNLOAD_COMPLETE == action) {\n            ...\n            val filePath = cursor.getString(cursor.getColumnIndex(DownloadManager.COLUMN_LOCAL_URI))\n            val bundle = Bundle()\n            bundle.putString("file_path", filePath)\n            findNavController().navigate(R.id.action_documents_list_fragment_to_document_viewer_fragment, bundle)\n            ...\n        }\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我尝试NavigationController从外部的上下文中获取BroadcastReceiver获取,但仍然遇到同样的问题。有什么想法吗?

\n

Cal*_*lin 0

我最终做的是在文档中创建深层链接https://developer.android.com/topic/libraries/architecture/navigation/navigation-implementing#Deeplink

然后使用配置的深层链接启动活动

            val deepLinkIntent = Intent(Intent.ACTION_VIEW)
            deepLinkIntent.data = Uri.parse("epix://downloads/$filePath")
            context.startActivity(deepLinkIntent)
Run Code Online (Sandbox Code Playgroud)

另请查看此 Codelab 部分https://codelabs.developers.google.com/codelabs/android-navigation/#10