【问题标题】:Why is activity A started when activity B is destroyed为什么活动B被销毁时活动A开始
【发布时间】:2015-04-05 22:55:45
【问题描述】:

我有 2 个活动,比如 A 和 B,A 像往常一样通过启动器图标启动。另一方面,B 是通过BroadcastReceiver 启动的。我在这里不太明白的是,当活动 B 被破坏然后活动 A 被打开时?我只是看不到这其中的联系,而且这种行为是不想要的。我之前通过禁用活动 A 的历史记录解决了这个问题,但新功能强制使用历史记录,因此需要另一种解决方案。

清单中的活动声明:

<activity android:name="com.example.A" 
    android:noHistory="false" android:launchMode="singleTask"  
    android:label="@string/APP_NAME">
    <intent-filter>
         <action android:name="android.intent.action.MAIN" />
         <category android:name="android.intent.category.LAUNCHER" />   
    </intent-filter>
</activity>       
<activity android:name="com.example.B" android:noHistory="true" 
    android:screenOrientation="portrait" android:label="@string/APP_NAME">
</activity>

以及如何从BroadcastReceiver启动活动B:

Intent intent = new Intent(context, B.class);
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
context.getApplicationContext().startActivity(intent);

我只是不明白活动 B 在 B 被销毁后如何找到活动 A 的方式?如何防止这种情况发生?

【问题讨论】:

  • activity's tasks and back stack 造成的。 Activity B 启动时,Activity A 会被存储在后台栈中,当Activity B 被销毁时,Activity A 会被带到前台。
  • @li2,Okey,我知道活动 A 必须存储在后台堆栈中才能发生这种行为,我还不明白活动 A 是如何放置在后台堆栈中的?由于活动 B 是从接收者开始的,与活动 A 无关?

标签: android android-intent android-activity


【解决方案1】:

当您启动B 时,Android 会检查是否已经存在具有与taskAffinity 相同的B 的现有任务(在您的情况下,是与A 关联的任务)。如果它找到了,它会将这个任务带到前台并在它上面启动B。当B 完成后,它会将用户放入A

要更改此行为,您需要为 B 提供与 A 不同的 taskAffinity。将此添加到 B 的清单声明中:

android:taskAffinity=""

现在B 将在其自己的任务中启动,即使已经存在包含A 的任务。

但是请注意,如果 AB 在不同的任务中运行,您可能应该为 B 提供不同的图标,或者至少是不同的标签,否则用户会感到困惑他查看最近的任务列表。他会看到A 的一个条目和B 的一个条目,但它们都有相同的图标和标签。

【讨论】:

猜你喜欢
  • 2014-06-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多