2016-06-09 4 views
1

При вызове другого действия, могу ли я быть уверенным, что переменная, хранящаяся в текущей активности, будет присутствовать при ее возврате?Состояние хранения и восстановления состояния

new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapter, View item, int pos, long id) { 
     Intent i = new Intent(Activity1.this, Activity2.class); 
     i.putExtra("position", pos); // 1 
     position = pos; // 2 
     startActivityForResult(i, REQUEST_CODE); // brings up the edit item activity 
    } 
}); 

Для приведенного выше кода, можно использовать (2) путем сохранения в текущей активности поля экземпляра или я должен передать значение, используя (1), а затем использовать getIntExtra() в onActivityResult(), чтобы восстановить это значение?

+1

'new Intent (Activity1.this' может быть' new Intent (item.theContext() ' – petey

ответ

1

В идеале вы бы просто сохранили состояние в Activity1. Таким образом, вам не придется передавать переменную через Activity2, а затем передать результат (что не является результатом чего-либо, сделанного в Activity2) назад к Activity1. Для того, чтобы сохранить значение position в Activity1 вы должны сделать следующее внутри вашего Activity:

private static final String KEY_ARG_POSITION = "KEY_ARG_POSITION"; 

    private int position; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 

     // Do whatever you are doing in onCreate already... 

     if (savedInstanceState != null) { 
      position = savedInstanceState.getInt(KEY_ARG_POSITION); 
     } 
    } 

    @Override 
    public void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 

     outState.putInt(KEY_ARG_POSITION, position); 
    } 

Это также актуально, если вы не хотите потерять это значение при изменении ориентации экрана или убивает OS и перезагружается вашей деятельности.

Наконец, ради сохранения ваш код организован, если вам не нужно использовать значение position в Activity2, я бы рекомендовал не подвергать Activity2 для любых данных, которые не нужно управлять.Если вы работаете над большим приложением, эти вещи могут складываться и быстро становиться беспорядочными.

+0

Я читал, что 'onSaveInstanceState()' необходимо сбалансировать с 'onRestoreInstanceState()', в то время как это не является частью Жизненный цикл действия и, например, 'onPause()' даже не назовут его. – Laurent

+0

@JohnDifool 'onSaveInstanceState()' wi Будет вызван, если действие будет убито. 'onCreate()' вызывается при восстановлении Activity. Если действие восстанавливается, 'savedInstanceState' в' onCreate() 'не будет равно null, что означает, что вы можете попытаться восстановить любые сохраненные в нем переменные. Я регулярно использую этот шаблон без проблем. У вас была возможность попробовать? – jch000

0

При использовании функции startActivityForResult ... вы предоставляете код запроса, который будет возвращен в методе onActivityResult. В то вы получите код запроса, а также коды результата (Sucess, отказ и т.д., а также Intent данных, которые вы можете установить от активности вы начали

Так что вы можете сделать:.

Intent i = new Intent(Activity1.this, Activity2.class); 
i.putExtra("position", pos); 
startActivityForResult(i, REQUEST_CODE); 

, а затем в классе деятельности2

Intent intent = new Intent(); 
intent.putExtras(getIntent().getExtra("position")); 
setResult(RESULT_OK, intent); 
finish(); 

, который в своей первой деятельности позвонит:

onActivityResult(int requestCode, int resultCode, Intent data) { 
//Check it's your requestCode, 
//Check resultCode == RESULT_OK or whatever you need 
//Grab your position from the data intent 
} 

См https://developer.android.com/training/basics/intents/result.html для получения дополнительной информации

+0

Это предполагает, что каждый раз, когда я переключаюсь на другое действие, мне придется сохранять все энергонезависимые поля, которые я не могу воссоздать из первоначального действия и передать его обратно, когда я его перезвоню, правильно? – Laurent

1

Да Он присутствует, когда вы вернетесь к Activity1 поэтому нет необходимости использовать getIntExtra. Просто сохраните свою позицию в глобальной переменной Activity1.

0

Мой совет: достаточно передать информацию в Intent, чтобы однозначно идентифицировать интересующий элемент данных. Не просто передавайте позицию, потому что позиции могут измениться, если порядок элементов изменится или другие элементы будут добавлены/удалены из списка. Представьте себе сценарий, в котором вы переходите из положения 2 в Activity2, но пока Activity2 встает, Activity1 перезагружает свои данные, а позиция 2 теперь является другим.

Кроме того, я не стал бы полагаться на член экземпляра вызывающей активности (т. Е. Строка position = pos в вашем коде). Возможно, что ваш Activity1 будет убит, а другая деятельность - непосредственная деятельность переднего плана. В этом случае он будет воссоздан, когда результат будет возвращен в Activity1, но это будет новый экземпляр Activity1, поэтому ваш член экземпляра position не будет иметь данные, которые вы задали ранее.

+0

Но что разумно сохранить? Если я последую вашим рассуждениям, мне нужно будет сериализовать и передать весь массив второму действию, правильно? – Laurent

+0

@ JohnDifool зависит от того, что вы делаете. Почему вам нужна позиция элемента вместо того, что идентифицирует сам элемент? – Karakuri