处理轮换变化和用户离开 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.");
}
}
所以我用 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.");
}
}