在我的应用程序中有三项活动。
A
可以打开B
B
可以打开C
,或返回A
,或返回C
(如果从C
打开)
C
可以打开B
,或返回A
我已使用各种RESULT_CODE
和onActivityResult
来实现此功能。但是,长时间使用应用程序后堆栈会变得太大!
我需要清除堆栈中的活动。查看我的应用程序结构,最好的清除方法围绕清除堆栈上的第二个活动(假设A
始终是堆栈上的第一个/底部活动)。我做了一个快速的绘画,使其更容易理解:
将B
添加到ABC
后,将删除之前的B
(堆栈中的第二个活动)。将C
添加到ACB
后,将删除之前的C
(堆栈中的第二个活动)。
我可以想到两种方法可以实现我所描述的:
清除堆栈中的第二个活动
删除堆栈中与我正在创建的活动相同的任何活动(C
创建B
,因此其他B
需要是清零)
但是,我还没有找到在代码中实现此功能的方法。我尝试过使用Intent.FLAG_ACTIVITY_CLEAR_TOP
,但在{@ 1}}之外清除堆栈中的所有内容,然后在顶部添加新活动。
所以我的问题:如何实施方法1或方法2?(无论哪一个)
以下是我清除堆栈中所有内容但A
:
A
我也对替代方法持开放态度。也许以某种方式使用Intent newActivity = new Intent(this, B.class);
newActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
startActivityForResult(newActivity, MY_REQUEST_CODE);
?
答案 0 :(得分:2)
所以看起来你想要保留B活动和C活动的一个实例。这可以通过在Manifest.xml中添加XML属性来完成
<activity android:name="B" android:launchMode="singleTask" </activity>
&#34; singleTask&#34; - 系统在新任务的根目录下创建活动并将意图路由到该任务。但是,如果活动的实例已存在,系统会通过调用其onNewIntent()方法将意图路由到现有实例,而不是创建新实例。 Refer to here for more information
答案 1 :(得分:1)
我遇到了同样的问题,要杀死一些特定的活动..我的解决方案是实现用于管理活动的StackActivityManager:
活动的保存完成了母班基础活动
每个活动都有一个静态且唯一的标记,用于指示哪个活动将从活动堆栈中删除
答案 2 :(得分:1)
尝试做方法:
Intent intent = new Intent(Activity1.this, Activity2.class);
startActivity(intent);
//The finish(); method, destroy the current activity.
finish();
在调用下一个活动后,当前的活动会破坏。 我希望它有效。 :)
答案 3 :(得分:0)
删除此行
newActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
尝试添加代码 -
Intent newActivity = new Intent(this, B.class);
newActivity.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
newActivity.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);
startActivityForResult(newActivity, MY_REQUEST_CODE);
答案 4 :(得分:0)
注意:Cory Charlton在他关于Fragment
的评论中所写的内容可能是遇到类似问题的人的最佳解决方案。我建议尝试该路线而不是我自己的解决方案。我使用自己的解决方案的唯一原因是因为我需要一个快速的解决方案,并且没有时间学习如何在截止日期之前实现Fragment
。
我最终通过A
活动始终开始C
活动而不是B
活动来解决问题。 B
活动不再创建C
活动,而是完成,以便返回C
。
这样堆栈永远不会超过3。
为了提供一些代码,我必须在完成B
活动之前添加它,因为它现在不再传递一个对象,而是返回它:
setResult(RESULT_OK, getIntent().putExtra(KEY_MY_OBJECT, myObject));