При разработке моего первого приложения для Android у меня было 3 разных способа начать новую деятельность (там, вероятно, больше, что я не знаю), и я не могу понять, отличаются ли они или они в основном работают таким же образом.
Например, у меня есть MainActivity
с меню (это компонент ActionBar, но он работает как меню). В меню есть возможность открыть AboutActivity
.
Мой первый подход был такой:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
getMenuInflater().inflate(R.menu.actionbar_main, actionBar.asMenu());
actionBar.findAction(R.id.actionbar_item_home).setIntent(new Intent(this, AboutActivity.class));
}
}
Мой второй подход, чтобы упростить организацию кода, я начал обрабатывать все пункты меню в своем собственном методе, как это:
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
ActionBar actionBar = (ActionBar)findViewById(R.id.actionbar);
getMenuInflater().inflate(R.menu.actionbar_main, actionBar.asMenu());
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch(item.getItemId()) {
case R.id.actionbar_item_home:
item.setIntent(new Intent(this, AboutActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
}
Третий подход очень похож на предыдущий, отличается только от строки кода, которая запускает AboutActivity
. Вместо:
item.setIntent(new Intent(this, AboutActivity.class));
Я изменил на:
startActivity(new Intent(this, AboutActivity.class));
Но это заставило меня задуматься о правильном способе справиться с этим. Мои вопросы:
- Между подходами № 2 и № 3 есть ли различия между ними? На мой взгляд,
setIntent
в основном определяет пункт меню Intent каждый раз, когда этот элемент выбирается. Что я считаю плохой вещью? В то время как startActivity
делает именно это. Но опять же, каждый раз, когда выбирается элемент, создается новое намерение, что приводит меня к следующему вопросу.
- На подходе № 1 у меня нет этой проблемы, намерение создается только один раз в методе действия
onCreate
(до тех пор, пока действие не будет уничтожено, я считаю). Но с точки зрения производительности / памяти (или чего-то еще, что может иметь значение), есть ли различия между следующим?
- a) Установите намерение один раз в методе
onCreate
- b) Запустить действие в обработчике меню
onOptionsItemSelected
- Теперь предположим, что текстовое поле находится на
AboutActivity
. Я нажимаю пункт меню и открываю упражнение, набираю что-нибудь в текстовом поле, возвращаюсь, снова нажимаю пункт меню, и текст исчезает. Я подумал, что только один раз создавал намерение (подход № 1), что состояние активности будет сохраняться и текстовое поле будет заполнено. Но это не так, он действует точно так же, как и все другие подходы, что еще больше смущает меня. В чем различия между ними?