【问题标题】:app restarts if select app from recent apps only when activity is start from Notification仅当活动从通知开始时,如果从最近的应用程序中选择应用程序,应用程序将重新启动
【发布时间】:2012-04-18 00:10:04
【问题描述】:

我的应用具有如下所示的活动堆栈

  • A:加载活动
  • 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 -> B -> C 。在活动 C 处按 Home 按钮并从最近的应用程序列表中调用它(长按 Home),显示 C。没关系。

但是当我从通知启动应用程序时,由于我不想显示加载屏幕,启动活动 B。因此,用户可以导航 B -> 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>

【问题讨论】:

    标签: android android-notifications


    【解决方案1】:

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

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

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

    【讨论】:

    • 最佳解决方案!谢谢
    • 非常好。完美运行!
    【解决方案2】:

    我假设您使用Intent.FLAG_ACTIVITY_NEW_TASK 处理了 2 个独立的任务,这些任务具有自己的活动回栈。第一个任务是在您从启动器启动A 时创建的,而第二个任务是在您从通知启动B 时创建的。如果是这样,那么您应该确保 2 个单独的任务是您真正需要的。

    【讨论】:

    • 不,我不想要 2 个任务。正如你所指出的,我删除了 Intent.FLAG_ACTIVITY_NEW_TASK。它不会出错,但会显示相同的行为。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多