如何区分是否将onDestroy()作为configuration更改序列的一部分进行调用?

在我的Activity中,一些外部的东西(服务)需要在onDestroy()中销毁。 但是当configuration改变发生时(例如键盘翻转),我不想要这个,因为它会立刻被恢复。

所以问题是:如何区分onDestroy()是否是由后退按键或部分configuration更改过程造成的?

在@ CommonsWare的答案后,这将是非常简单的)如下所示:

@Override onDestroy() { if (mIsChangeConfig == true) { mIsChangeConfig = false: } else { stopService(); } } @Override onRetainNonConfigurationInstance() { mIsChangeConfig = true; } 

  • 活动OnDestroy从来没有打电话?
  • 按下主页button时,活力正在被破坏。
  • 如何区分是否将onDestroy()作为配置更改序列的一部分进行调用?
  • onDestroy每次进入屏幕时都会被调用
  • 在Activity被杀死并重新创建后,片段仍然存在
  • Android Activity onDestroy()并不总是被调用,如果被调用,则只执行部分代码
  • Android在方向更改时保存状态
  • Android:当Dalvik杀死这个活动时,不会调用Activity.onDestroy()
  • 在Android 3.x(API Level 11)中,可以调用isChangingConfigurations()以查看由于configuration更改而导致活动被破坏。

    在此之前,重写onRetainNonConfigurationInstance()并将布尔数据成员(例如isChangingConfigurations )设置为true ,并检查onDestroy()中的数据成员。

    这可能会为你做诀窍(从如何区分方向变化和离开应用程序的android ):

    使用Activity的isFinishing()方法。

    示例代码:

     @Override protected void onDestroy() { super.onDestroy(); if (isFinishing()) { // Do stuff } else { // It's an orientation change. } } 

    我有一个解决scheme的情况下,必须在onStop()上做X,但是如果有configuration更改(显然你没有isChangingConfigurations()可用),你不希望这样做。

    该技术包括对AsyncTask执行这个X操作并延迟。 您可以在onStop()/ onPause()和onRetainCustomNonConfigurationInstance()中调用AsyncTask来取消任务。 这样,如果用户按下home键,例如,X代码将在后台执行。 但是,如果有屏幕旋转,X代码将不会被执行,因为任务在被执行之前将被取消(这就是延迟的含义)。

    我用它来解决wakelocks的问题:在onPause()上释放它们,但是如果用户改变屏幕的方向则不会。

    这是我的代码:

     private class ReleaseWakeLockDelayedTask extends AsyncTask<WakeLock, Integer, Integer>{ @Override protected Integer doInBackground(WakeLock... params) { try { // Delay so that onRetainCustomNonConfigurationInstance is in // time of cancelling the task Thread.sleep(5000); } catch (InterruptedException e) {} if(isCancelled()) return null; releaseWakeLock(params[0]); // own method that calls the actual release return null; } } @Override public Object onRetainCustomNonConfigurationInstance() { ... if(mReleaseWakeLockTask != null && mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED){ mReleaseWakeLockTask.cancel(true)); } ... } @Override protected void onPause() { // create and call the task boolean wRun; if(mReleaseWakeLockTask != null){ if(mReleaseWakeLockTask .getStatus() != AsyncTask.Status.FINISHED) wRun= false; else wRun= true; }else wRun = true; if(wRun){ mReleaseWakeLockTask = new mReleaseWakeLockTask (); mReleaseWakeLockTask .execute(wakeLock); } } 

    希望能帮助到你!