6

我的应用程序在方向更改时有一个奇怪的行为。

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

奇怪的行为:

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

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

我不使用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;
    }

我希望这有帮助?!

4

1 回答 1

0

我遇到了类似的问题,看来您的问题的原因是压倒一切的onRetainCustomNonConfigurationInstance()

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

也许您的保留状态也持有对 a 的引用Context

于 2012-08-31T19:38:40.777 回答