gpt4 book ai didi

android - 只有当 Activity 从通知开始时,如果从最近的应用程序中选择应用程序,应用程序才会重新启动

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:41:30 29 4
gpt4 key购买 nike

我的应用程序具有如下所示的 Activity 堆栈

  • A:加载 Activity
  • B:主要 Activity
  • C:详细 Activity

list 是这样的

<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 。在 Activity C 按下主页按钮并从最近的应用程序列表中调用它(长按主页),显示 C。没关系。

但是当我从通知启动应用程序时,因为我不想显示加载屏幕,启动 Activity B。因此,用户可以导航 B -> C。

但是当用户在 Activity C 中按下 Home 并从最近的应用程序列表中选择应用程序时,B 会重新启动并且不会保留状态。所以 C Activity 总是消失。

我尝试了很多标志选项,但没有找到解决方案。我想要的是应用程序的行为就像用户从启动器启动应用程序时一样。

我为这样的通知创建了待定 Intent 。在我的应用中,我应该为 Activity B 使用 Intent.FLAG_ACTIVITY_CLEAR_TOP

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

我认为最近的应用列表发送与通知相同的 Intent ,所以总是调用 Activity B。但是当我从启动器启动应用程序时,它只会将我发送到最后一个 Activity C,而不是 B。

请帮助我。 :(

更新

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

  • 添加具有不同任务亲和性的新 Activity D。此 Activity 刚刚开始 B(主要 Activity )
  • 在通知中,启动activity D
  • 在 Activity D 中,使用一些标志启动 Activity 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);
}

我已经像下面这样注册了 Activity 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>

最佳答案

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

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

如果为真,则 Activity 是从历史记录中打开的,而不是通知的 Intent 。

关于android - 只有当 Activity 从通知开始时,如果从最近的应用程序中选择应用程序,应用程序才会重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10008509/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com