在多个会话之间管理/恢复应用程序back stack的最佳做法是什么?
工作流程的实例:
在第7步,我想恢复活动C,如果用户按下后退按钮2次,它将返回活动B,然后返回活动A.
[编辑]添加详细信息。
在上面的第7步之后,Android中默认情况下会发生这样的事情:
我希望用户觉得他还在使用相同的会话:
在避免内存泄漏的同时,解决这种情况的好方法是什么?
[第二次编辑] 我一直在为所有活动使用commong类UIController制作一个解决方法,并使用LauncherActivity将逻辑委托给UIController。
由于我只需要在ActivityC启动时重建后台堆栈,这个解决方案似乎工作正常:
public class UIController
{
private boolean _launched = false;
static private final UIController __instance = new UIController();
static public UIController getInstance() { return __instance; }
// Enforces the Singleton Pattern by preventing external access to constructor
private UIController() { }
public void onActivityCreated(Activity activity) {
if (!_launched)
{
if ( shouldRebuildStack() )
{
// Rebuild Activity stack
// Npte : actually Android will add ActivityA and ActivityB to the stack
// but will *NOT* create them right away. Only ActivityC will be
// created and resumed.
// Since they are in the back stack, the other activities will be
// created by Android once needed.
startActivity(activity, ActivityA.class);
startActivity(activity, ActivityB.class);
startActivity(activity, ActivityC.class);
} else {
// Starts default activity
startActivity(activity, ActivityA.class);
}
_launched = true;
}
}
public void onActivityResumed(Activity activity) {
memorizeCurrentActivity( activity.getClass().toString() );
}
private void memorizeCurrentActivity( String className ) {
// write className to preferences, disk, etc.
}
private boolean shouldRebuildStack() {
String previousActivity = " [load info from file, preferences, etc.] ";
return (previousActivity != null && previousActivity.equals("my.package.ActivityC"));
}
private void startActivity(Activity caller, Class newActivityClass)
{
Intent intent = new Intent(caller, newActivityClass);
intent.addFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
caller.startActivity( intent );
}
}
// This is the default activity in the AndroidManifest.xml
// This prevents ActivityA from starting right away if the UIController
// wants to rebuild the stack.
public class LauncherActivity() {
protected void onCreate(Bundle data) {
super.onCreate(data);
UIController.getInstance().onActivityCreated(this);
finish();
}
}
public class ActivityA() {
protected void onCreate(Bundle data) {
super.onCreate(data);
UIController.getInstance().onActivityCreated(this);
}
protected void onResume() {
super.onResume();
UIController.getInstance().onActivityResumed(this);
}
}
public class ActivityB() {
// onCreate() & onResume(), same as ActivityA
}
public class ActivityC() {
// onCreate() & onResume(), same as ActivityA
}
public class LauncherActivity() {
protected void onCreate(Bundle data) {
super.onCreate(data);
UIController.getInstance().onActivityCreated(this);
finish();
}
}
public class ActivityA() {
protected void onCreate(Bundle data) {
super.onCreate(data);
UIController.getInstance().onActivityCreated(this);
}
protected void onResume() {
super.onResume();
UIController.getInstance().onActivityResumed(this);
}
}
public class ActivityB() {
// same as ActivityA
}
public class ActivityC() {
// same as ActivityA
}
如果某人有更好的解决方案,请随时发布。
答案 0 :(得分:5)
听起来你应该将其设置为true并让Android处理活动堆栈。
如果在任务的根活动中将此属性设置为“true”,则不会发生刚刚描述的默认行为。即使经过很长一段时间,任务仍会保留堆栈中的所有活动。