处理轮换变化和用户离开 activity

Handling rotation changes and user leaving activity

所以我用 doSomething() 方法得到了这个 Activity。当用户离开 Activity 并在一段时间后恢复时必须调用此方法。此代码工作正常。问题是:当用户旋转 phone(方向改变)时,该方法也会被调用。我不想在 Orientation Change 上调用该方法。这是我的 Activity 代码

public class MainActivity extends AppCompatActivity
{
  private static boolean callMethod=true;
  @Override
    protected void onResume() {
        super.onResume();
        if(callMethod)
           doSomething();
    }
    @Override
    protected void onPause() {
        super.onPause();
        callMethod=true;
    }

private void doSomething()
{
    Log.i(“doSomething()”,”Did something.”);
}
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
       setContentView(R.layout.activity_main);
        if(callMethod)
          doSomething();
    }

}

提前致谢!

从 API 13 开始,您可以在清单中使用 configChanges

将以下内容添加到清单中。这可以防止在屏幕旋转时重新创建 activity:

<activity android:name=".Activity_name"
android:configChanges="orientation|keyboardHidden">

请注意,在此之后,您应该自行处理屏幕方向更改。为此,您应该在 activity 中覆盖以下函数:

 public void onConfigurationChanged(Configuration newConfig) {
    super.onConfigurationChanged(newConfig);
    if(newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE){
        setContentView(R.layout.layout_landscape);
    }
    else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) {
        setContentView(R.layout.layout);         
    }
}

我在您的评论中看到您添加了 isChangingConfigurations() 标志,这应该可以解决问题,但您应该保留该状态而不是将其设为静态变量。否则,如果您的进程在您的应用程序进入后台时被终止,您将失去该状态。

public class MainActivity extends AppCompatActivity {
    private static final String KEY_CALL_METHOD = "key_call_method";

    private boolean callMethod = true;

    @Override
    protected void onCreate(Bundle savedState) {
        super.onCreate(savedState);
        setContentView(R.layout.activity_main);

        if (savedState != null) {
            callMethod = savedState.getBoolean(KEY_CALL_METHOD);
        }
    }

    @Override
    protected void onResume() {
        super.onResume(); 
        if (callMethod) {
            doSomething();
        }
    }

    @Override
    protected void onPause() {
        super.onPause();
        if (!isChangingConfigurations()) {
            callMethod = true;
        }
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
        outState.putBoolean(KEY_CALL_METHOD, callMethod);
    }

    private void doSomething() {
        Log.i("doSomething()", "Did something.");
    }
}