2012-03-05 35 views
6

我在我的方向改变应用中有一个奇怪的行为方向改变后的活动二次

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

奇怪的行为:

  • 当我开始在纵向模式下的应用程序,并改变方向为横向。然后就像家庭活动的第二个例子。因为然后在横向模式下按下后退按钮并不会关闭应用程序,而不会改变方向(家庭活动是我应用程序中的第一个活动),但是会从左向右进行滑动动画(如启动新活动)并再次显示家庭活动(但我认为是另一个实例)。第二次按下后退按钮关闭应用程序。
  • 当我在横向模式下启动应用程序并将纵向更改为纵向模式时,按后退按钮会导致从右向左的幻灯片动画(如关闭活动)并再次显示主页活动。
  • 当我启动应用程序并进行两个方向更改纵向横向肖像时,后退按钮将关闭应用程序。

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

我不使用android:configChanges="orientation|keyboardHidden|screenSize",所以方向更改应该遵循正常的android活动生命周期,并销毁活动的“旧”肖像(或风景)版本。
我的活动继承自FragmentActivity。 我使用onSaveInstanceState来传递parceable(它不包含任何活动的引用),我使用onRetainCustomNonConfigurationInstanceread 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; 
    } 

我希望这有助于?!

+0

告诉我们代码... – 2012-03-05 20:59:11

+0

...包括您的清单中的活动声明,PLZ。 – Turnsole 2012-03-05 21:42:33

+3

+1对于一个很好的问题,向我们展示你的努力:) – 2012-03-07 14:25:12

回答

0

我遇到了类似的问题,看来你的问题的原因是重写onRetainCustomNonConfigurationInstance()

我检查了我的保留状态对象,发现它保存着对Context的引用。我将它包装在WeakReference中,并且正常的行为返回并且没有奇怪的双重事件。

也许你的保留状态也持有对Context的引用?