gpt4 book ai didi

android - 方向改变后的第二个 Activity 实例

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:45:40 25 4
gpt4 key购买 nike

我在方向改变的应用程序中有一个奇怪的行为

正常行为:
当我打开我的应用程序时,我的家庭 Activity 开始了。当我进入下一个 Activity (画廊)时,它会正常启动(从右到左有滑入动画)。当我使用返回键返回时,当前 Activity (画廊)完成(从左到右滑动动画)。

奇怪的行为:

  • 当我以纵向模式启动应用并将方向更改为横向时。然后是家庭 Activity 的第二个实例。因为然后在横向模式下按下后退按钮不会像没有方向改变那样关闭应用程序(家庭 Activity 是我应用程序中的第一个 Activity )而是从左到右制作滑动动画(比如开始新 Activity )并再次显示家庭 Activity (但我认为是另一个例子)。再次按下后退按钮关闭应用程序。
  • 当我以横向模式启动应用程序并将方向更改为纵向模式时,按下后退按钮会产生从右到左的滑动动画(如关闭 Activity )并再次显示主页 Activity 。
  • 当我启动应用程序并进行纵向-横向-纵向两个方向更改时,后退按钮会按应有的方式关闭应用程序。

所以这就像风景和肖像模式被视为两种不同的 Activity 。

我不使用 android:configChanges="orientation|keyboardHidden|screenSize" ,因此方向更改应遵循正常的 android Activity 生命周期并销毁 Activity 的“旧”纵向(或横向)版本。
我的 Activity 继承自 FragmentActivity .我正在使用 onSaveInstanceState传递一个 parceable(不包含对 Activity 的任何引用),我正在使用 onRetainCustomNonConfigurationInstance ( read here ) 传递几个 AsyncTask秒。但是这些任务中的所有引用(如果有的话)都在 onRetainCustomNonConfigurationInstance 中被销毁了。并在 getLastCustomNonConfigurationInstance 之后恢复(使用新创建的 Activity ) .

有什么可能导致这种行为的想法吗?

编辑:
list 文件中的 Activity 声明:
<activity android:name=".activities.smartphone.HomeSmartphone" android:label="@string/app_name"></activity>

家庭智能手机扩展家庭
主页扩展 MyFragmentActivity
MyFragmentActivity 扩展了 android.support.v4.app.FragmentActivity

在 MyFragmentActivity 中,我只是在 onCreate、onRestart、onStart、onSaveInstanceState、onPause、onResume、onStop、onDestroy 中通过调用跟踪类的一些静态方法来执行一些日志记录/跟踪操作,这些方法只包含对应用程序上下文的引用。不是 Activity 上下文。

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;
}

希望这对您有所帮助?!

最佳答案

我遇到了类似的问题,看来您的问题的原因是覆盖 onRetainCustomNonConfigurationInstance()

我检查了我的保留状态对象,发现它持有对 Context 的引用。我将它包装在 WeakReference 中,然后返回了正常行为,并且没有奇怪的双重实例徘徊。

也许您的保留状态还包含对 Context 的引用?

关于android - 方向改变后的第二个 Activity 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9573855/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com