使用PendingIntent时不遵守singleTask和singleInstance?

Kev*_*vin 4 android launchmode android-pendingintent

我将launchMode设置为singleTask的活动:

<activity
    android:name="com.blah.blah.MyActivity"
    android:launchMode="singleTask">
</activity>
Run Code Online (Sandbox Code Playgroud)

我有一个PendingIntent持续通知,启动该活动:

Intent activityIntent = new Intent( this,
                                    MyActivity.class );
TaskStackBuilder stackBuilder = TaskStackBuilder.create( this );
stackBuilder.addParentStack( MyActivity.class );
stackBuilder.addNextIntent( activityIntent );
PendingIntent resultingActivityPendingIntent = stackBuilder.getPendingIntent( REQUEST_CODE,
                                                                              PendingIntent.FLAG_UPDATE_CURRENT );
...
m_notificationBuilder.setContentIntent( resultingActivityPendingIntent );
startForeground( ONGOING_NOTIFICATION_ID,
                 m_notificationBuilder.build() );
Run Code Online (Sandbox Code Playgroud)

当我与现有的MyActivity交互时,我点击Home并通过启动器重新启动MyActivity,MyActivity onNewIntent()会按预期调用.

问题是当我与现有的MyActivity交互时,我点击正在进行的通知时,会创建一个新的MyActivity onCreate(),现有的MyActivity将被销毁onDestroy().我预计onNewIntent()会调用MyActivity .为什么不这样呢?

我试过这些答案没有成功:

Dav*_*ser 8

你的问题是由于使用TaskStackBuilder.此代码导致您的问题:

Intent activityIntent = new Intent( this,
                                MyActivity.class );
TaskStackBuilder stackBuilder = TaskStackBuilder.create( this );
stackBuilder.addParentStack( MyActivity.class );
stackBuilder.addNextIntent( activityIntent );
PendingIntent resultingActivityPendingIntent =
         stackBuilder.getPendingIntent(REQUEST_CODE,
         PendingIntent.FLAG_UPDATE_CURRENT );
Run Code Online (Sandbox Code Playgroud)

当您使用TaskStackBuilder这种方式时,它会在生成的Intents中设置其他标志,这些标志会在您的Activity启动之前重置任务(任务中的所有活动都将被销毁).

而是使用:

Intent activityIntent = new Intent( this,
                                MyActivity.class );
PendingIntent resultingActivityPendingIntent =
         PendingIntent.getActivity(this, REQUEST_CODE,
             activityIntent, PendingIntent.FLAG_UPDATE_CURRENT );
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案..我花了将近两周的时间才发现这个。然而,正如凯文提到的,你必须卸载该应用程序,然后再尝试它 (2认同)