单击通知后

时间:2018-07-17 10:21:51

标签: android push-notification back-stack

我正在使用Firebase Cloud Messenger(FCM)将通知推送到我的应用程序。 当应用程序在后台运行时会收到通知,因为通知没有有效负载(数据),因此不会触发onMessageReceived。一切都很好,但是这意味着我无法创建自己的通知,因为所有内容都由系统任务栏自动处理。

当我单击通知时,我希望清除整个后备堆栈,并重新启动应用程序。基本上,我要与this post相反。 这应该是默认的行为。

但是,当我单击通知时,如果该应用程序已经打开,则该应用程序将从启动器重新启动,但位于现有Backstack的顶部。

例如,如果您拥有:

HomeScreen -> Page1

点击通知后,您现在已进入堆栈:

HomeScreen -> Page1 -> HomeScreen

仅应为:

HomeScreen

我的启动器是一个活动,仅在应用程序启动时显示,所以我不希望将其保留在后台。事实证明,这就是为什么我遇到这个问题。因此,基本上,如果启动器活动本身调用finish()和/或在清单中设置了noHistory="true",则在单击通知时不会清除Backstack。

我该如何解决这个问题?

1 个答案:

答案 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();
    }
}