我在我的方向改变应用中有一个奇怪的行为。方向改变后的活动二次
正常行为:
当我打开我的应用程序,我的家庭活动开始。当我进入下一个活动(画廊)时,它会正常启动(从右向左滑动动画)。 当我返回使用后退键时,当前活动(图库)完成(从左向右滑动动画)。
奇怪的行为:
- 当我开始在纵向模式下的应用程序,并改变方向为横向。然后就像家庭活动的第二个例子。因为然后在横向模式下按下后退按钮并不会关闭应用程序,而不会改变方向(家庭活动是我应用程序中的第一个活动),但是会从左向右进行滑动动画(如启动新活动)并再次显示家庭活动(但我认为是另一个实例)。第二次按下后退按钮关闭应用程序。
- 当我在横向模式下启动应用程序并将纵向更改为纵向模式时,按后退按钮会导致从右向左的幻灯片动画(如关闭活动)并再次显示主页活动。
- 当我启动应用程序并进行两个方向更改纵向横向肖像时,后退按钮将关闭应用程序。
所以它就像风景和肖像模式被视为两种不同的活动。
我不使用android:configChanges="orientation|keyboardHidden|screenSize"
,所以方向更改应该遵循正常的android活动生命周期,并销毁活动的“旧”肖像(或风景)版本。
我的活动继承自FragmentActivity
。 我使用onSaveInstanceState
来传递parceable(它不包含任何活动的引用),我使用onRetainCustomNonConfigurationInstance
(read here)来传递几个AsyncTask
s。但是这些任务中的所有引用(如果有的话)在onRetainCustomNonConfigurationInstance
中销毁并在getLastCustomNonConfigurationInstance
之后恢复(使用新创建的活动)。
任何想法可能会导致此行为?
编辑:在清单,文件
活动宣言:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>
HomeSmartphone延伸主页
家庭延伸MyFragmentActivity
MyFragmentActivity延伸android.support.v4.app.FragmentActivity
在MyFragmentActivity我只是做onCreate,onRestart,onStart,onSaveInstanceState,onPause,onResu一些日志记录/跟踪的东西我,onStop,onDestroy通过调用跟踪类的一些静态方法,它只持有对应用程序上下文的引用。不适用于活动环境。
首页是由HomeSmartphone和HomeTablet扩展的抽象类。这两个类只是在不同的布局中进行一些特殊的加载/刷新/初始化。
大多数任务都是在抽象的Home类中完成的。
public HomeRetainedObjects retained = new HomeRetainedObjects();
public boolean adIsShown = false;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
this.setContentView(R.layout.home);
Log.i("DEBUG", "onCreate(Home)");
if (savedInstanceState != null) {
this.adIsShown = savedInstanceState.getBoolean("adIsShown");
}
// write/update values in shared preferences
this.initPreferences();
// recover retained objects (mostly AsyncTasks)
this.recoverRetained();
// show content/refresh content
this.init();
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
outState.putBoolean("adIsShown", this.adIsShown);
Log.i("DEBUG", "onSaveInstanceState(Home)");
}
public void recoverRetained() {
Object retained = this.getLastCustomNonConfigurationInstance();
if (retained instanceof HomeRetainedObjects) {
this.retained = (HomeRetainedObjects) retained;
if (this.retained.loadMessageTask != null) {
this.retained.loadMessageTask.restoreContext(this);
}
}
}
@Override
public Object onRetainCustomNonConfigurationInstance() {
if (this.retained.loadMessageTask != null) {
this.retained.loadMessageTask.destroyContext();
}
return this.retained;
}
我希望这有助于?!
告诉我们代码... – 2012-03-05 20:59:11
...包括您的清单中的活动声明,PLZ。 – Turnsole 2012-03-05 21:42:33
+1对于一个很好的问题,向我们展示你的努力:) – 2012-03-07 14:25:12