我正在使用Firebase Cloud Messenger(FCM)将通知推送到我的应用程序。 当应用程序在后台运行时会收到通知,因为通知没有有效负载(数据),因此不会触发onMessageReceived。一切都很好,但是这意味着我无法创建自己的通知,因为所有内容都由系统任务栏自动处理。
当我单击通知时,我希望清除整个后备堆栈,并重新启动应用程序。基本上,我要与this post的相反。 这应该是默认的行为。
但是,当我单击通知时,如果该应用程序已经打开,则该应用程序将从启动器重新启动,但位于现有Backstack的顶部。
例如,如果您拥有:
HomeScreen -> Page1
点击通知后,您现在已进入堆栈:
HomeScreen -> Page1 -> HomeScreen
仅应为:
HomeScreen
我的启动器是一个活动,仅在应用程序启动时显示,所以我不希望将其保留在后台。事实证明,这就是为什么我遇到这个问题。因此,基本上,如果启动器活动本身调用finish()
和/或在清单中设置了noHistory="true"
,则在单击通知时不会清除Backstack。
我该如何解决这个问题?
答案 0 :(得分:0)
我找到了解决方案。这个想法是创建一个新的LauncherActivity,负责启动现有的活动器并清除进程中的Backstack。
可能有其他方法可以执行此操作,但是我想将原始的Launcher保留为noHistory="true"
,否则如果我直接对其实施以下解决方案,则下一个Activity的过渡动画会出现问题。
新的启动器称为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();
}
}