Chr*_*ian 6 android orientation-changes android-activity
我的应用程序中有一个奇怪的行为方向改变.
正常行为:
当我打开我的应用程序时,我的家庭活动开始了.当我进入下一个活动(画廊)时,它会正常启动(从右到左滑动动画).当我使用后退键返回时,当前活动(图库)已完成(从左到右的滑动动画).
奇怪的行为:
所以它就像风景和肖像模式被视为两种不同的活动.
我不使用android:configChanges="orientation|keyboardHidden|screenSize",因此方向更改应遵循正常的Android活动生命周期并销毁活动的"旧"纵向(或横向)版本.
我的活动继承自FragmentActivity.我正在使用onSaveInstanceState传递一个parceable(它不包含对该活动的任何引用)并且我正在使用onRetainCustomNonConfigurationInstance(在这里阅读)传递几个AsyncTasks.但是这些任务中的所有引用(如果它们都有)在之后被销毁onRetainCustomNonConfigurationInstance并恢复(使用新创建的活动)getLastCustomNonConfigurationInstance.
什么可能导致这种行为?
编辑:
清单文件中的活动声明:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>
HomeSmartphone扩展Home
Home扩展MyFragmentActivity
MyFragmentActivity扩展android.support.v4.app.FragmentActivity
在MyFragmentActivity中,我只需要在onCreate,onRestart,onStart,onSaveInstanceState,onPause,onResume,onStop,onDestroy上执行一些日志记录/跟踪操作,方法是调用跟踪类的一些静态方法,这些方法只保存对应用程序上下文的引用.不是活动背景.
Home是一个抽象类,由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;
}
Run Code Online (Sandbox Code Playgroud)
我希望这有帮助?!
我遇到了类似的问题,看来您的问题的原因是压倒性的onRetainCustomNonConfigurationInstance()。
我检查了我的保留状态对象,发现它持有对Context. 我将它包裹在 a 中WeakReference,正常行为返回,并且没有奇怪的双重实例徘徊。
Context也许您的保留状态也持有对?的引用。
| 归档时间: |
|
| 查看次数: |
2024 次 |
| 最近记录: |