Android-通过通知打开后退箭头不会返回MainActivity

时间:2019-11-10 09:30:52

标签: android

在android应用中,我说2个活动-MainActivity和OtherActivity。当我在OtherActivity中按向后箭头时,它又回到MainActivity,这工作正常。这是OtherActivity中代码的一部分:

public boolean onOptionsItemSelected(@NonNull MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
        onBackPressed();
        return true;
    }
    return super.onOptionsItemSelected(item);
}

但是当我发送通知时,单击通知窗口后,OtherActivity将打开-可以,可以。这是由通知中的以下代码引起的:

private void sendNotification(String title, String body) {
    Intent i = new Intent(this, OtherActivity.class);
    i.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pi = PendingIntent.getActivity(this,
            0 /* Request code */,
            i,
            PendingIntent.FLAG_ONE_SHOT);
}

这很好用,但是现在如果我按下OtherActivity上的后退箭头,它将退出应用程序,而不会进入MainActivity。

我已经在清单文件中为OtherActivity设置了父项,所以我不确定为什么不将其转到MainActivity:

   <activity
            android:name=".OtherActivity"
            android:label="OtherActivity"
            android:parentActivityName=".MainActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme" />

2 个答案:

答案 0 :(得分:1)

“后退”按钮的工作方式是重新启动上一个活动,如果从通知中打开应用程序后按回退,则代码会跳过主要活动,这使得正常情况下您单击该应用程序即会关闭返回,处理此问题的方法将需要首先进行一些工作,但随后在其他任何步骤或通知处理中都将为您带来魅力。

您需要做的是创建一个处理应用程序启动的层,例如Splash Screen > Authentication > MainActivity > any other Activity (or stop at Main if first time launching and not from notification),这样,当用户单击通知时,请勿将其重定向到{{1} },例如,重定向到OtherActivity,然后让应用启动器执行之前的所有步骤,以到达您的AppLauncher,然后再到达MainActivity,如果用户单击从OtherActivityOtherActivity等返回,他将在从通知中打开应用后按回退后将始终返回OtherActivity2

关于为MainActivity设置新的Intent以重新打开MainActivity,这是一个糟糕的解决方案,因为您正在为已打开的onBackPressed创建新的Instance,并且将巨大的数据泄漏和性能问题,如果您在这种情况下继续在“主要活动”和“其他活动”之间来回重定向,您会注意到该应用的运行速度变慢,直到终止为止。

答案 1 :(得分:0)

好的,我想终于找到了答案。在我的Sendnotification方法中,我使用以下方法:

    Intent backIntent = new Intent(this, MainActivity.class);
    backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    Intent notificationIntent = new Intent(this, OtherActivity.class);
    notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);

    final PendingIntent pi = PendingIntent.getActivities(this, 1,
            new Intent[] {backIntent, notificationIntent}, PendingIntent.FLAG_ONE_SHOT);

现在这可以按预期工作。