我的应用有以下活动堆栈
和清单就像这样
<activity A>
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity B android:launchMode="singleTask"/>
<activity C/>
当我从启动器启动应用时,它充当A - &gt; B - &gt; C 。在活动C按主页按钮并从最近的应用程序列表中调出(长按Home),显示C.这没关系。
但是当我从Notification启动应用程序时,因为我不想显示加载屏幕,所以启动活动B.因此,用户可以导航B - &gt; C.
但是当用户在活动C按Home并从最近的应用列表中选择应用时,B将重新启动并且不会保留状态。所以C活动总是消失。
我尝试了很多标志选项,但我找不到解决方案。我想要的是,该应用程序的行为就像用户从启动器启动应用程序一样。
我为这样的通知创建了待处理意图。在我的应用中,我应该使用Intent.FLAG_ACTIVITY_CLEAR_TOP
进行活动B.
Notification notice = new Notification(R.drawable.icon_notification, context.getString(R.string.app_name), System.currentTimeMillis());
Intent intent = new Intent(context, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK|Intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.putExtras(i);
PendingIntent contentIntent = PendingIntent.getActivity(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT);
我认为最近的应用列表会在通知时发送相同的意图,因此始终会调用活动B.但是当我从启动器启动应用程序时,它只是将我发送到最后一个活动C,而不是B。
请帮助我。 :(
我已经解决了这个问题,如下所示。
if ((getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0 ) {
i.setFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET | Intent.FLAG_ACTIVITY_NEW_TASK);
} else {
i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
}
我已注册活动D,如下所示
<activity
android:name="D"
android:clearTaskOnLaunch="true"
android:excludeFromRecents="true"
android:exported="false"
android:launchMode="singleInstance"
android:noHistory="true"
android:taskAffinity="xxx"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.MAIN"/>
</intent-filter>
</activity>
答案 0 :(得分:9)
由于通知已启动应用程序,它现在已成为历史记录的一部分 - 您可能只想在实际点击它时处理它。检查:
(getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0
如果是,则从历史记录中打开活动,而不是通知的意图。
答案 1 :(得分:1)
我认为由于使用了Intent.FLAG_ACTIVITY_NEW_TASK
,您可以使用自己的活动来处理2个单独的任务。当您从启动器启动A
时创建第一个任务,而当您从通知启动B
时创建第二个任务。如果是这样,那么你应该确保你真正需要的是两个独立的任务。