据我所知,当屏幕方向发生变化时,会调用当前活动onDestroy(),然后调用onCreate()来有效地重新创建活动。 我需要知道如何以编程方式判断应用程序是否已退出,或者是否只是更改了方向。
一个方法是让前一个活动在调用onResume()方法时通知我,这会让我知道用户按下了后退按钮并且方向没有被更改。
P.S。我正在寻找比听取后面的硬件按钮点击更优雅的解决方案。
以下是我想做的事情:
我有两个标签,当第一次输入活动或用户离开活动并且现在正在输入活动时,会根据某些标准显示某个标签。
当方向改变时,我需要保持在同一个标签上。
答案 0 :(得分:90)
使用活动的isFinishing()
方法。
@Override
protected void onDestroy() {
super.onDestroy();
if (isFinishing()) {
// do stuff
} else {
//It's an orientation change.
}
}
答案 1 :(得分:20)
您可以使用isChangingConfigurations()
阅读documentation
检查此活动是否正在进行中 销毁以便使用新配置重新创建。这是 经常在onStop()中用来确定状态是否需要 清理或将被传递到活动的下一个实例 通过onRetainNonConfigurationInstance()。
返回如果要拆除活动以便重新创建 使用新配置,返回true; else返回false
以简单的方式解释
isChangingConfigurations()
是一种方法,用于检查活动是否会被销毁以便再次重新创建(由于方向改变)
如何使用它?
如果你使用api> = 11那么没问题,但如果你使用api< 11然后我们必须处理这个方法手册我做了一个名为 IsconfigChange的布尔变量
private boolean IsconfigChange ;
...
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IsconfigChange = true ;
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
public boolean isChangingConfigurations() {
if(android.os.Build.VERSION.SDK_INT >= 11){
Log.i("DEBUG", "Orientation changed api >= 11 ");
return super.isChangingConfigurations();
}else {
Log.i("DEBUG", "Orientation changed api < 11 ");
return IsconfigChange;
}
}
@TargetApi(Build.VERSION_CODES.HONEYCOMB)
@Override
protected void onStop() {
super.onStop();
if(isChangingConfigurations()){
Log.i("DEBUG", "isChangingConfirgurations OnStop Called");
} else{
Log.i("DEBUG", "OnStop Called");
}
}
Summery
您可以使用isChangingConfigurations
中的onStop
来检查应用是否会被销毁或者方向发生变化。
或者您可以使用isFinishing
检查我的回答here
答案 2 :(得分:3)
for API lvl&gt; = 11 Activity有一个isChangingConfigurations()
方法
答案 3 :(得分:1)
您可以在onDestroy
回调中获取Activity.getChangingConfigurations()方法的值。这将返回ORIENTATION_PORTRAIT之类的结果,您可以根据current orientation检查结果。
请注意,活动结束和方向更改不是此处要考虑的唯一条件:如何返回主屏幕,来电和其他应用程序窃取焦点,以及所有其他当您的Activity不再位于堆栈前面时的场景?
大多数时候你不需要这样做。如果您正在尝试修复某些活动状态问题(通常在旋转屏幕时显示为NullPointerException
)
通过捕获定向事件;查看Android Activity生命周期,确保您不仅仅是试图修复设计缺陷。如果您不确定,请在本网站上发布原始问题。