Можно ли проверить, был ли onCreate вызван из-за изменения ориентации?

Мне нужно действовать по-другому в методе onStart() в зависимости от того, как был вызван onCreate() в результате из orientation change или нет. Можно ли это проверить?

На самом деле мне нужно сделать something, когда начинается действие , за исключением случая, когда пользователь меняет ориентацию.

Мне нужно четко различать случаи, когда пользователь просто переключился на другое приложение и вернулся обратно, или изменил ориентацию устройства.

Ответы

Ответ 1

public class MyActivity extends Activity {
    boolean fromOrientation=false;
    SharedPreferences myPrefLogin;
    Editor prefsEditor;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        prefsEditor = myPrefLogin.edit();
        myPrefLogin = this.getSharedPreferences("myPrefs", Context.MODE_WORLD_READABLE);
        fromOrientation = myPrefLogin.getString("fromOrient", false);

        if(fromOrientation) {
             // do as per need--- logic of orientation changed.
        } else {
             // do as per need--- logic of default onCreate().
        }
    }

    @Override
    public Object onRetainNonConfigurationInstance() {
        prefsEditor.putString("fromOrient", true);
        prefsEditor.commit();
        return null;
    }

    @Override
    protected void onDestroy() {
        if(fromOrientation) {
            prefsEditor.putString("fromOrient", false);
            prefsEditor.commit();
        }
        super.onDestroy();
    }  
}

флаг fromOrientation (сообщает, что состояние было изменено или было изменено) выше, чем мы делали, например, по дефалуту, мы рассматриваем, что onCreate() не вызывается из-за изменения ориентации. Если ориентация изменилась (onRetainNonConfigurationInstance()), мы задаем значение флага, которое позволяет нам знать, вызывается ли onCreate() из ориентации или нет. И, наконец, onDestroy() снова reset флаг ориентации.

Ответ 2

Следуя идее Нахтана, я написал следующее:

in onCreate():

if ( (oldConfigInt & ActivityInfo.CONFIG_ORIENTATION)==ActivityInfo.CONFIG_ORIENTATION ) {
    // ... was rotated
} else {
    // ... was not rotated
}

в onDestroy():

super.onDestroy();
oldConfigInt = getChangingConfigurations();

Ответ 3

Попробуйте getChangingConfigurations. Используйте это, чтобы обнаружить, когда действие уничтожается из-за изменения ориентации, установки флага и проверки этого флага при вызове onCreate.

Это имеет то преимущество, что позволяет вам знать, почему активность перезапускается без переопределения конфигурации ориентации в манифесте.

Ответ 4

Просто проверьте комплект: когда операция начинается, пакет будет равен нулю. Если есть изменение ориентации, оно должно быть не нулевым.

Из андроидных документов:

Если операция повторно инициализируется после того, как она была закрыта, этот пакет содержит данные, которые он недавно предоставил в onSaveInstanceState (Bundle). Примечание: В противном случае оно равно null.

Изменить: Я не думаю, что вам нужно предоставить пакет в onSaveInstanceState, чтобы он был не нулевым после изменения ориентации, но это было бы тривиально.

Ответ 5

Как говорили другие, сохраните состояние:

public class MyActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if(savedInstanceState == null) {
            // app started afresh, don't check orientation
            /* do application first-run stuff */
        } else {
            // re-started, so check for orientation change
            boolean orientationChanged = false;
            if(savedInstanceState != null) {
                int lastOrientation = savedInstanceState.getInt("last_orientation");
                orientationChanged = (getOrientation() != lastOrientation);
            }

            if(orientationChanged) {
                // orientation changed
                /* do stuff */
            } else {
                // orientation has not changed
                /* do stuff */
            }
        }
    }

    @Override
    public void onSaveInstanceState(Bundle savedInstanceState) {
        super.onSaveInstanceState(savedInstanceState);
        savedInstanceState.putInt("last_orientation", getOrientation());
    }

    private int getOrientation() {
        // ...
    }
}

Ответ 6

Вы можете попробовать следующее. В каждом onStart вы можете сохранить текущую ориентацию (посмотрите здесь). Если это первый вызов onStart, ничего не делать при других вызовах, проверьте, изменилась ли ориентация и сделайте то, что вам нужно.

private int m_currentOrientation = -1;

public void onStart()
{
   int oldOrientation = m_currentOrientation; // 
   m_currentOrientation = getCurrentOrientation(); // As in the link above
   if ((oldOrientation != -1) && (oldOrientation != m_currentOrientation))
   {
       // Do what you need
   }
}

Ответ 7

В этом случае, почему бы вам не заниматься настройками конфигурации (ориентацией) самостоятельно. Сообщите андроиду не обрабатывать ориентацию экрана.

android:configChanges="keyboardHidden|orientation"

Затем вы просто переопределяете метод onConfigurationChanged, чтобы получить возможность пересмотреть представление или что-то еще. Оставьте вещи, которые вы не хотите исполнять.

@Override
public void onConfigurationChanged(Configuration newConfig) {
  super.onConfigurationChanged(newConfig);
  //do your jobs 
}

Ответ 8

mCurrentOrientation будет -1, если приложение запускается в первый раз.

static int mCurrentOrientation = -1;

public void onStart()
{
   int oldOrientation = mCurrentOrientation; 
   mCurrentOrientation = getCurrentOrientation(); 
   if ((oldOrientation != -1) && (oldOrientation != mCurrentOrientation)) {
       // Do your something here.
   }
}

Если я правильно понял ваш вопрос, я думаю, что это должно сработать для вас.