Почему я не могу вернуться к своей исходной активности из другой активности, вызванной намерением push-уведомления? - PullRequest
1 голос
/ 03 мая 2019

Мое приложение имеет 2 действия: основное и подробное.Когда я нажимаю кнопку на главном, она генерирует push-уведомление, которое при нажатии открывает страницу с подробностями.

Проблема в том, что я не верю, что настроил что-либо, чтобы предложить, что действие должно открываться с любым другимсвойства запуска, отличные от стандартных, и их флаги не установлены, чтобы предложить, что моя деятельность открыта по-другому.Однако при нажатии на уведомление и открытии нового действия, когда я нажимаю кнопку «Назад», я возвращаюсь на главный экран, и активные задачи больше не доступны.

Я экспериментально заметил, что если я направлю намерение, вызванное уведомлением, вернуться к основному действию, а не к подробному, то оно будет работать так, как я ожидал.Я могу нажать кнопку в первом экземпляре основного действия, чтобы запустить уведомление, щелкнуть уведомление, чтобы вызвать второй экземпляр основного действия, а затем вернуться назад, чтобы вернуться к исходному экземпляру основного действия.Он даже имеет правильное состояние деталей, представленных в оригинале (текстовое поле, заполненное тем, что я предоставил, чтобы вызвать первое уведомление, чтобы сказать).

Я также обнаружил, что, если я направляю намерение запустить детализированное действие, но устанавливаю привязанность, связанную с активностью, к чему-то еще, что оно работает, просто создавая новую задачу с этим действием какединственная деятельность, связанная с задачей.Но это не то, чего я хочу, и не то, что, по моему мнению, должно происходить в любом случае.

РЕДАКТИРОВАТЬ: я добавил кнопку, которая ведет меня к активности детали с помощью стандартного намерения.Это работает как задумано.Я также добавил кнопку в операцию сведений, которая генерирует уведомление для основной операции, работающей по той же логике, что и кнопка на главной, которая запускает уведомление, чтобы перейти к операции «Подробности», за исключением измененного класса намерений.Нажатие на это создает уведомление и помещает основное действие в уже существующий стек задач, как это стандартно.

Таким образом, похоже, что проблема связана с действием детали, на которое нацелено ожидающее намерение, но я неточно выяснил, что еще, и следование деталям на сайте Android не поможет (хотя это очевидно, так как именно с этого я и начал)

Код:

Создает push-уведомление (найденопо основной деятельности)

fun generatePush2(view: View){
    var generalTapIntent = Intent(this, ActivityDetail::class.java)
    var pendingIntent: PendingIntent = PendingIntent.getActivity(this, 0, generalTapIntent, 0);

    var notificationId = 0;
    var builder = NotificationCompat.Builder(this, CHANNEL_ID)
            .setSmallIcon(R.drawable.notification_icon)
            .setContentTitle("Instant Message")
            .setContentText(txt_notification.text)
            .setPriority(NotificationCompat.PRIORITY_DEFAULT)
            .setContentIntent(pendingIntent) //sets the event to fire when notification is clicked
            .setAutoCancel(true) //Removes notification when user taps it

    with(NotificationManagerCompat.from(this)){
            notify(notificationId, builder.build());
    }
}

Подробности манифеста Android (для доказательства)

<application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
        <activity android:name=".ActivityDetail">
        </activity>
        <activity android:name=".MainActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN"/>
                <category android:name="android.intent.category.LAUNCHER"/>
            </intent-filter>
        </activity>
    </application>

Ответы [ 2 ]

0 голосов
/ 03 мая 2019

ТАК, не понимая ошибки полностью, я обнаружил, что проблема связана с двумя вещами. AVD я использовал и название деятельности. На оригинальном AVD я изменил имя действия с ActivityDetail на ActivityDetail2, и это решило всю проблему. Я понял, что что-то случилось с активностью, когда при создании третьего действия не было проблемы. К сожалению, после смены имени (shift + f6 в Android-студии) проблема снова возникла. Озадаченный я тогда удалил AVD (пришлось переустановить Android Studio, чтобы исправить эмулятор: процесс не удалось из-за ошибки с кодом ошибки 0) и создал новый с другим типом телефона и другой версией Android. Затем я смог запустить приложение с именем действия «ActivityDetail», и проблема не возникла.

Мне также не удалось воссоздать проблему на оригинальном AVD. Это говорит мне о том, что что-то в AVD было связано с этим конкретным именем активности, установленным каким-либо образом через вызов приложения, который я мог сделать, следуя руководству на официальной странице уведомлений Android: https://developer.android.com/training/notify-user/build-notification

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

0 голосов
/ 03 мая 2019

вы можете переопределить onBackPressed () следующим образом:

public void onBackPressed()  
{  
    this.startActivity(new Intent(DetailActivity.this,MainActivity.class));  
    return;  
}  

Если вы хотите, чтобы основное действие выглядело иначе, чем по умолчанию, вы все равно можете передать некоторые данные через намерение и отобразить их так, как вы хотите использовать:

Подробная деятельность

intent.putExtra(String key, Object data);

Основная деятельность

intent.getExtra(String key);
...