Backstack не очищается при нажатии на уведомление

Я использую Firebase Cloud Messenger (FCM) для отправки уведомлений в свое приложение. Уведомления принимаются, когда приложение находится в фоновом режиме, поэтому onMessageReceived не запускается, поскольку уведомление не имеет полезной нагрузки (данных). С этим все в порядке, но это означает, что я не могу создать собственное уведомление, так как все автоматически обрабатывается в системном трее.

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

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

Например, если у вас есть:

HomeScreen -> Page1

при нажатии на уведомление у вас теперь в стеке:

HomeScreen -> Page1 -> HomeScreen

когда это должно быть только:

HomeScreen

Моя пусковая установка - это действие, которое отображается только при запуске приложения, поэтому я не хочу, чтобы оно оставалось в backstack. Оказывается, вот почему я получаю эту проблему. Таким образом, в основном, если Launcher Activity вызывает finish() на себе и / или имеет noHistory = "true", установленный в манифесте, backstack не очищается при нажатии на уведомление.

Как я могу решить эту проблему?

1
0
238
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я нашел решение. Идея состоит в том, чтобы создать новую LauncherActivity, отвечающую за запуск существующей и очистку backstack в процессе.

Вероятно, есть и другие способы сделать это, но я хотел сохранить исходную Launcher с noHistory = "true", иначе у меня возникнут проблемы с анимацией перехода со следующим действием, если я реализовал нижеприведенное решение непосредственно для него.

Новый лаунчер называется StartActivity.

В Манифесте:

<activity
    android:name = ".StartActivity"
    android:screenOrientation = "portrait"
    android:theme = "@style/AppTheme">
    <intent-filter>
        <action android:name = "android.intent.action.MAIN" />

        <category android:name = "android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

Активность:

public class StartActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, LauncherActivity.class);
        // Add the flags to clear the stack
        intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK | Intent.FLAG_ACTIVITY_NEW_TASK);
        // Start the intent with a defined transition animation. The animation is not 
        // required but it make the transition seamless.
        startActivity(intent, getFadeInOutAnimation(this));

        // Necessary for the app not to crash. Basically just a FrameLayout
        setContentView(R.layout.activity_start);
    }

    public static Bundle getFadeInOutAnimation(Context context) {
        // Allows us to display a fading animation as transition between the activities.
        // The animation can be whatever you want
        return ActivityOptions.makeCustomAnimation(context,
                R.anim.fade_in, R.anim.fade_out).toBundle();
    }
}

Другие вопросы по теме