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

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

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

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

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

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

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

希望能帮助到你!