Я использую Firebase Cloud Messenger (FCM) для отправки уведомлений в свое приложение. Уведомления принимаются, когда приложение находится в фоновом режиме, поэтому onMessageReceived не запускается, поскольку уведомление не имеет полезной нагрузки (данных). С этим все в порядке, но это означает, что я не могу создать собственное уведомление, так как все автоматически обрабатывается в системном трее.
Когда я нажимаю на уведомление, я ожидаю, что весь бэкстэк будет очищен, и приложение перезапустится с нуля. В основном я хочу противоположный из эта почта. Предполагается, что это поведение по умолчанию.
Однако, когда я нажимаю на уведомление, если приложение уже было открыто, оно перезапускается из средства запуска, но поверх существующего бэкстека.
Например, если у вас есть:
HomeScreen -> Page1
при нажатии на уведомление у вас теперь в стеке:
HomeScreen -> Page1 -> HomeScreen
когда это должно быть только:
HomeScreen
Моя пусковая установка - это действие, которое отображается только при запуске приложения, поэтому я не хочу, чтобы оно оставалось в backstack. Оказывается, вот почему я получаю эту проблему. Таким образом, в основном, если Launcher Activity вызывает finish() на себе и / или имеет noHistory = "true", установленный в манифесте, backstack не очищается при нажатии на уведомление.
Как я могу решить эту проблему?
Я нашел решение. Идея состоит в том, чтобы создать новую 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();
}
}