Динамическое начало активности в Android? - PullRequest
46 голосов
/ 01 февраля 2011

Есть ли способ динамически изменить начальную активность в Android на основе условно? То, что я пытался сделать (это не сработало), было следующим:

  1. удалить категорию ЗАПУСК, как определено в моем AndroidManifest.xml
  2. создать пользовательский класс приложения, который приложение использует
  3. переопределите метод onCreate моего класса Application, чтобы определить некоторый код, подобный следующему:

.

if (condition) {
    startActivity(new Intent(this, MenuActivity.class));
} else {
    startActivity(new Intent(this, LoginActivity.class));
}

Ответы [ 2 ]

58 голосов
/ 01 февраля 2011

Почему бы не иметь начальный Activity без пользовательского интерфейса, который проверяет условие в его onCreate, затем запускает следующий Activity, а затем вызывает finish() для себя? Я никогда не звонил finish() изнутри onCreate(), поэтому я не уверен, сработает ли это.

EDIT
Кажется, работает нормально. Вот некоторый код, чтобы сделать его более понятным.
Начальная Activity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Intent intent;
    if (condition) {
       intent = new Intent(this, ClassA.class);
    } else {
       intent = new Intent(this, ClassB.class);
    }
    startActivity(intent);
    finish();
    // note we never called setContentView()
}

Другое Activity:

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
}
8 голосов
/ 03 августа 2012

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

if (!userIsLoggedIn) {
    setContentView(R.layout.signup);
} else {
    setContentView(R.layout.homescreen);
}

Два важных примечания к этому подходу:

1: Вместо того, чтобы писать в onCreate(), вы хотите поместить принятие решения в onResume() именно потому, что последнее всегда вызывается всякий раз, когда экран должен отображаться впереди. Вы можете видеть это из жизненного цикла активности Android . Так, если, например, пользователь просто скачал мое приложение и запустил его в первый раз, потому что ни один пользователь не вошел в систему, он будет перенаправлен на страницу регистрации. Когда она закончила регистрацию и по какой-то причине нажимает кнопку HOME (не BACK, которая вообще выходит из приложения!), А затем возобновляет приложение, макет, который она увидит, уже является домашним экраном. Если я поместу условное выражение в onCreate(), то отобразится экран регистрации, поскольку в соответствии с жизненным циклом он не возвращается к onCreate() при возврате приложения на фронт.

2: Это решение идеально, только если объединение функций этих двух видов деятельности не приведет к созданию длинного дьявольского блока кода. Как я уже сказал, мой проект был небольшим (его основная функция встречается в фоновом режиме), поэтому в одной динамической Activity не было слишком много. Безэкранный Activity - определенно правильный путь, если вам нужно, чтобы ваш код был более читабельным.

...