onResume()中的getIntent()始终返回相同的动作,如何使用它?

cpr*_*ack 5 android android-intent android-notifications android-activity android-pendingintent

我正在以这样的意图显示通知:

Intent intentOpen = new Intent(this, MainActivity.class);
intentOpen.setAction("ACTION_SHOW_BACKUP_FRAGMENT");
intentOpen.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntentOpen = PendingIntent.getActivity(this, 0, intentOpen, PendingIntent.FLAG_UPDATE_CURRENT);
notificationBuilder.setContentIntent(pendingIntentOpen);
Run Code Online (Sandbox Code Playgroud)

如您所见,该操作设置为"ACTION_SHOW_BACKUP_FRAGMENT",以便当用户单击通知时,我的singleTop MainActivity可以使用来获取onResume()方法中的操作getIntent().getAction()

为了使它起作用,我必须onNewIntent()像这样实现:

protected void onNewIntent(Intent intent) {
    super.onNewIntent(intent);
    setIntent(intent);
}
Run Code Online (Sandbox Code Playgroud)

到目前为止,一切顺利,操作已收到,我可以显示备份视图。但是,如果我按下主页按钮,以便应用程序进入后台,然后通过最近的应用程序菜单再次进入该菜单,该onResume()方法将再次被调用,但"ACTION_SHOW_BACKUP_FRAGMENT"操作仍然存在!因此,我无法区分用户是真的单击了通知还是只是恢复应用程序

我已经尝试使用Intent和PendingIntent标志的组合日志解决问题,但是没有任何效果。setIntent(new Intent());在使用操作后,我也尝试致电,onResume()但在下次我恢复该应用程序时onNewIntent()仍然可以执行"ACTION_SHOW_BACKUP_FRAGMENT"操作。

我该如何解决这个问题?

cpr*_*ack 3

最后我找到了 Intent 和 PendingIntent 的正确标志组合:

// Create pending intent to open the backup fragment
intentOpen.setFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
PendingIntent pendingIntentOpen = PendingIntent.getActivity(this, 0, intentOpen, PendingIntent.FLAG_CANCEL_CURRENT);
Run Code Online (Sandbox Code Playgroud)

当我仍然使用onResume()with的意图时,这有效setIntent(null);