从通知意图中删除数据

时间:2013-11-06 13:41:21

标签: android android-pendingintent

我的发射器活动意图有问题.Scenerio是: 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);

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

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

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

    }
    }

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

4 个答案:

答案 0 :(得分:26)

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

如果您从带有附加功能的通知中启动您的应用,然后通过从最近任务列表中选择它来返回您的应用,Android将再次启动该应用,就像它从通知中启动一样(即:使用演员)。这可能是一个错误或一个功能,取决于你问谁。

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

<强> 1。使用FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS

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

<强> 2。检测FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY

当用户从最近的任务列表中启动您的应用时,Android会在Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY中设置标记Intent,该标记将传递到您的启动活动的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);

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

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);

答案 1 :(得分:0)

我注意到使用碎片。我在活动A中读取了一个QR码,它打开片段1,将其内容发送到网络服务,如果正确,则将其替换为片段2.当用户按下时,活动A呼叫中的onBackPressed完成。如果用户在列表中再次选择应用程序,则会打开片段1而不是片段2.

如果extra包含一个表示片段2已经打开的字段,我解决了检查onBackPressed的问题。如果为true,则调用moveTaskToBack(true)而不是finish()

活动A

<BootstrapperApplicationRef Id="WixStandardBootstrapperApplication.RtfLicense">

    <bal:WixStandardBootstrapperApplication LicenseFile="YourLicense.rtf"
                                            LogoFile="YourLogo.png"
                                            SuppressOptionsUI="yes"
                                            SuppressRepair="yes" />

</BootstrapperApplicationRef>

片段2

@Override
public void onBackPressed() {
 Bundle extras = getIntent().getExtras();
 if(extras.containsKey(Constants.TICKET_DONT_SHOW_QRCODE_SCREEN)){
    moveTaskToBack(true);
 }else {
    finish();
 }
}

答案 2 :(得分:0)

我已经测试了stackoverflow的所有答案,但没有运气,对我有用的是这个。创建一个助手类来检查活动标志。或者一个函数,无所谓。

 curl -v http://www.antXXX.XX

}

然后使用如下代码。它返回一个布尔值,因此您可以在它为 false 时检查意图附加项

 object FlagHelper {
fun notLaunchedFromNotification(activity: AppCompatActivity): Boolean {
    return activity.intent.flags and Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY == Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
}

答案 3 :(得分:0)

将 android:launchMode="singleInstance" 添加到您的启动器活动 然后在开始活动时使用标志 Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS