Как правильно начать новую активность в Android? - PullRequest
0 голосов
/ 21 сентября 2011

При разработке моего первого приложения для 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));

Но это заставило меня задуматься о правильном способе справиться с этим. Мои вопросы:

  1. Между подходами № 2 и № 3 есть ли различия между ними? На мой взгляд, setIntent в основном определяет пункт меню Intent каждый раз, когда этот элемент выбирается. Что я считаю плохой вещью? В то время как startActivity делает именно это. Но опять же, каждый раз, когда выбирается элемент, создается новое намерение, что приводит меня к следующему вопросу.
  2. На подходе № 1 у меня нет этой проблемы, намерение создается только один раз в методе действия onCreate (до тех пор, пока действие не будет уничтожено, я считаю). Но с точки зрения производительности / памяти (или чего-то еще, что может иметь значение), есть ли различия между следующим?
    • a) Установите намерение один раз в методе onCreate
    • b) Запустить действие в обработчике меню onOptionsItemSelected
  3. Теперь предположим, что текстовое поле находится на AboutActivity. Я нажимаю пункт меню и открываю упражнение, набираю что-нибудь в текстовом поле, возвращаюсь, снова нажимаю пункт меню, и текст исчезает. Я подумал, что только один раз создавал намерение (подход № 1), что состояние активности будет сохраняться и текстовое поле будет заполнено. Но это не так, он действует точно так же, как и все другие подходы, что еще больше смущает меня. В чем различия между ними?

1 Ответ

0 голосов
/ 21 сентября 2011

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

Если вы хотите сделать что-то вроде варианта 1, но в лучшем месте, onCreateOptionsMenu () будет лучшим выбором.

«Меню» являются особым случаем для начала деятельности. Обычно вы делаете что-то вроде # 3, где вы просто вызываете startActivity, когда вам это нужно. SetIntent для меню просто делает это за кадром.

Я также думаю, что есть способ сделать это через XML. Но я не могу точно узнать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...