如何区分方向更改和离开应用程序android

Dus*_*ica 47 lifecycle android

我知道当屏幕方向改变时,调用当前活动onDestroy(),然后调用onCreate()以有效地重新创建活动.我需要知道如何以编程方式判断应用程序是否已退出,或者是否只是更改了方向.

一种方法是让前一个活动在调用其onResume()方法时通知我,这将让我知道用户按下了后退按钮并且方向没有被更改.

PS我正在寻找一种比听取后面硬件按钮点击更优雅的解决方案.

这是我想要做的:

我有两个选项卡,当第一次输入活动或用户离开活动并且现在正在输入活动时,会根据某些标准显示某个选项卡.

当方向改变时,我需要保持在同一个选项卡上.

dmo*_*mon 96

使用Activity的isFinishing()方法.

@Override
  protected void onDestroy() {
    super.onDestroy();
    if (isFinishing()) {
      // do stuff
    } else { 
      //It's an orientation change.
    }
  }
Run Code Online (Sandbox Code Playgroud)

  • 这种方法的一个副作用是:如果您切换到另一个应用程序,它将无法完成您的活动应用程序(因此不会调用此方法).如果应用程序然后被Android操作系统关闭以节省内存 - 这个方法**将被调用,`isFinishing()`将为FALSE(参见此处:http://developer.android.com/reference/android/ app/Activity.html#onDestroy())因此错误地执行了方向更改代码. (5认同)
  • 要保存当前选项卡,可以将其ID保存在`onSaveInstanceState()`中,然后在`onCreate()`中读取它,这样你甚至不需要打扰isFinishing().但要小心,第一次启动应用程序时,bundle将为null. (2认同)
  • 如果是第一次,则bundle应该为null.即使它不是null(由于某种原因),您保存的选项卡值也不应该存在,因此您将加载"默认"选项卡. (2认同)

Min*_*wzy 21

你可以使用isChangingConfigurations()Read from 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");
        }
    }
Run Code Online (Sandbox Code Playgroud)

综述

您可以使用isChangingConfigurationsonStop检查应用程序停止被破坏或由于取向改变.

或者你可以在这里isFinishing查看我的答案


Mau*_*ycy 5

对于 API lvl >= 11 的 Activity 有一个isChangingConfigurations()方法