Отправить аргумент через PendingIntent NavDeepLinkBuilder - PullRequest
0 голосов
/ 18 октября 2018

У меня возникают трудности с отправкой аргумента через PendingIntent уведомления с использованием NavDeepLinkBuilder.Я могу получить пункт назначения Activity для запуска, щелкнув уведомление, но Activity Intent не содержит значение аргумента, которое я передал через NavDeepLinkBuilder.Вместо этого Intent возвращает defaultValue, который я установил на графике навигации - "noJobId".

Создание уведомления :

val notification =
    NotificationCompat.Builder(context, context.getString(R.string.notification_channel_id_new_job))
        ...
        .setContentIntent(
            NavDeepLinkBuilder(context)
                .setComponentName(NewJobDetailsActivity::class.java)
                .setGraph(R.navigation.main_graph)
                .setDestination(R.id.newJobDetailsActivity)
                .setArguments(
                    NewJobDetailsActivityArgs.Builder()
                        .setJobId(event.jobId)
                        .build()
                        .toBundle()
                )
                .createPendingIntent()
        )
        .build()

notificationManager.notify(notificationId, notification)

contextв уведомлении используется FirebaseMessagingService.

Пункт назначения Activity onCreate():

val jobId: String = NewJobDetailsActivityArgs.fromBundle(intent?.extras).jobId

main_graph.xml График навигации :

<navigation
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main_graph"
    app:startDestination="@id/jobsFragment">

    <fragment
        android:id="@+id/jobsFragment"
        android:name=".ui.jobs.JobsFragment"
        android:label="JobsFragment">

        <action
            android:id="@+id/action_jobsFragment_to_newJobDetailsActivity"
            app:destination="@id/newJobDetailsActivity" />

    </fragment>

    <fragment
        android:id="@+id/historyFragment"
        android:name=".ui.history.HistoryFragment"
        android:label="HistoryFragment" />

    <fragment
        android:id="@+id/profileFragment"
        android:name=".ui.profile.ProfileFragment"
        android:label="ProfileFragment" />

    <activity
        android:id="@+id/newJobDetailsActivity"
        android:name=".ui.job.NewJobDetailsActivity"
        android:label="activity_new_job_details"
        tools:layout="@layout/activity_new_job_details">

        <argument
            android:name="jobId"
            android:defaultValue="noJobId" // just for testing
            app:argType="string" />

    </activity>

</navigation>

Кто-нибудь еще сталкивался с этой проблемой?Я чувствую, что это ошибка в компоненте навигации, но я еще не уверен на 100%.Любопытно, что здесь чего-то не хватает.

Зависимости : android.arch.navigation: navigation-фрагмент-ktx: 1.0.0-alpha06, android.arch.navigation: navigation-ui-ktx: 1.0.0-alpha06

Плагин : androidx.navigation.safeargs

1 Ответ

0 голосов
/ 06 декабря 2018

Я разместил эту проблему на общедоступной системе отслеживания проблем Google и получил следующий ответ:

NavDeepLinkBuilder передает свои аргументы в NavController для глубокой ссылки на конкретное место назначения.Направления деятельности на самом деле являются скорее точками выхода из навигационного графика, чем чем-то, с чем можно / должно быть тесно связано.

Источник: https://issuetracker.google.com/issues/118964253

Автор этой цитаты рекомендует использовать TaskStackBuilder вместо NavDeepLinkBuilder при создании PendingIntent, местом назначения которого является Activity.Вот что я закончил:

NotificationCompat.Builder(context, context.getString(R.string.notification_channel_id_new_job))
    ...
    .setContentIntent(
        TaskStackBuilder.create(context).run {
            addNextIntentWithParentStack(Intent(context, DestinationActivity::class.java).apply {
                putExtras(DestinationActivityArgs.Builder(jobId).build().toBundle())
            })
            getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT)
        }
    )
    .build()

Это решение позволяет мне успешно углубить ссылку на пункт назначения Activity, но при этом я могу ссылаться на аргументы, определенные в навигационном графике для этого Activity черезсгенерированный построитель DestinationActivityArgs и доступ к аргументам из метода назначения Activity onCreate() работают.

Это решение также правильно обрабатывает случаи, когда задача приложения отсутствует в списке «недавних приложений», приложение находится на переднем плане, отображая некоторые другие Activity или Fragment, или приложение находится вна переднем плане и уже на месте назначения Activity.addNextIntentWithParentStack() правильно обрабатывает навигацию вверх, поэтому нажатие на кнопку вверх из пункта назначения Activity возвращает обратно к логическому родителю Activity, как определено в AndroidManifest.

Это немного обидно, что это решение неЯ не использую эту библиотеку навигации для создания PendingIntent, но это похоже на лучшую альтернативу.

...