从通知意图中删除数据

use*_*897 7 android android-pendingintent

我的启动器活动意图有问题.Snenerio是:1.向我的启动器活动发送意图表单通知服务

PendingIntent contentIntent = PendingIntent.getActivity(this, TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID, new Intent(this, MainActivity.class).putExtra("is_log", true), Intent.FLAG_ACTIVITY_CLEAR_TOP);
Run Code Online (Sandbox Code Playgroud)

2.在我的MainActivity中,我得到了这个意图.代码是:

if(this.getIntent().getExtras()!=null){

        boolean isLogNewTripScreen  = (boolean)this.getIntent().getExtras().getBoolean("is_log");

    }
    }
Run Code Online (Sandbox Code Playgroud)

3.这项工作正常,但是当我来自通知服务时,但是当我从非通知服务启动时,意图中的数据仍然存在.如何从意图中删除该数据.

Dav*_*ser 28

编辑:我已经创建了一个示例应用程序来测试这个问题和可能的解决方案.以下是我的发现:

如果您通过附加通知启动应用程序,然后通过从最近任务列表中选择它来返回应用程序,Android将再次启动应用程序,方式与通知启动相同(即:使用附加功能).这可能是错误或功能,具体取决于您的要求.

您需要添加其他代码来处理这种情况.我可以提供2条建议:

1.使用 FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

当您创建您的通知,设置标志Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTSIntent.然后,当用户选择通知并从通知启动应用程序时,这将不会在最近任务列表中为此任务创建条目.此外,如果此应用程序的最近任务列表中有条目,则该条目也将被删除.在这种情况下,用户将无法从最近任务列表返回此任务.这可以通过消除用户从最近任务列表中启动应用程序的可能性来解决您的问题(但仅当应用程序已从通知启动时).

2.检测 FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

当用户从最近的任务列表中启动您的应用,Android的设置标志Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORYIntent传递到onCreate()您的发射活动的.您可以检测到此标志的存在,onCreate()然后您知道应用程序已从最近的任务列表启动,而不是从通知中启动.在这种情况下,您可以忽略Intent仍然包含数据的附加内容的事实.

选择最适合您应用程序工作流程的解决方案.谢谢你的问题,这是一个有趣的挑战:-)


附加信息:

您正在创建PendingIntent错误.你在打电话

PendingIntent contentIntent = PendingIntent.getActivity(this,
        TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID,
        new Intent(this, MainActivity.class).putExtra("is_log", true),
        Intent.FLAG_ACTIVITY_CLEAR_TOP);
Run Code Online (Sandbox Code Playgroud)

您将Intent.FLAG_ACTIVITY_CLEAR_TOP作为第4个参数传递给getActivity().但是,该参数应该是PendingIntent标志.如果你想设置FLAG_ACTIVITY_CLEAR_TOPIntent,你需要做的是这样的:

PendingIntent contentIntent = PendingIntent.getActivity(this,
        TripLoggerConstants.PENDING_TRIPS_NOTIFICATION_ID,
        new Intent(this, MainActivity.class).putExtra("is_log", true)
        .addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP), 0);
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,这对我帮助很大.我使用"(intent.getFlags()&Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY)!= 0"来检测应用程序是从历史记录启动的. (7认同)