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

Mix*_*Mix 18 android ondestroy android-activity

在我的Activity中,需要在onDestroy()中销毁一些外部事物(服务).但是当配置发生变化时(例如键盘翻转),我不希望这样,因为它会立即恢复.

所以问题是:如何区分onDestroy()是否是由Back-key press或部分配置更改过程引起的?

在@ CommonsWare的回答之后它会很简单)类似于:

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

@Override 
onRetainNonConfigurationInstance() { 
  mIsChangeConfig = true; 
}
Run Code Online (Sandbox Code Playgroud)

Com*_*are 24

在Android 3.x(API级别11)中,您可以调用isChangingConfigurations()以查看由于配置更改而导致活动是否被销毁.

在此之前,覆盖onRetainNonConfigurationInstance()并设置一个布尔数据成员(例如isChangingConfigurations)true,并检查该数据成员onDestroy().

  • 如果我正确理解了文档,那么`isChangingConfigurations()`已经在`onStop()`中可用了,但`onRetainNonConfigurationInstance()`在`onStop()`和`onDestroy()`之间调用,如果有的话.所以这些选项不幸完全不相同. (6认同)
  • 此外,如果在前Honeycomb上使用支持库FragmentActivity(android.support.v4.app.FragmentActivity),则onRetainNonConfigurationInstance()被声明为final,但您可以覆盖onRetainCustomNonConfigurationInstance()而不是相同的效果.(这有点不明显,因为不推荐使用的标签会将您带到一个完全不同的API,不能以这种方式使用.) (4认同)

Ger*_*rre 6

这可能适合你(从如何区分方向更改和离开应用程序android):

使用Activity的isFinishing()方法.

示例代码:

@Override
protected void onDestroy() {
  super.onDestroy();

  if (isFinishing()) {
    // Do stuff
  } else { 
    // It's an orientation change.
  }
}
Run Code Online (Sandbox Code Playgroud)