如果仅在活动从通知开始时从最近的应用程序中选择应用程序,则app会重新启动

时间:2012-04-04 09:33:58

标签: android android-notifications

我的应用有以下活动堆栈

  • A:loading活动
  • B:主要活动
  • C:详细活动

和清单就像这样

<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。

请帮助我。 :(

更新

我已经解决了这个问题,如下所示。

  • 添加具有不同任务关联的新活动D.此活动刚刚开始B(主要活动)
  • 在通知中,开始活动D
  • 在活动D中,使用一些标志启动活动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>

2 个答案:

答案 0 :(得分:9)

由于通知已启动应用程序,它现在已成为历史记录的一部分 - 您可能只想在实际点击它时处理它。检查:

(getIntent().getFlags() & Intent.FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY) != 0

如果是,则从历史记录中打开活动,而不是通知的意图。

答案 1 :(得分:1)

我认为由于使用了Intent.FLAG_ACTIVITY_NEW_TASK,您可以使用自己的活动来处理2个单独的任务。当您从启动器启动A时创建第一个任务,而当您从通知启动B时创建第二个任务。如果是这样,那么你应该确保你真正需要的是两个独立的任务。