Подтвердить что ты не робот

Динамическая активность запуска в Android?

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

  • удалите категорию LAUNCHER, как определено в моем AndroidManifest.xml
  • создать собственный класс приложений, который использует приложение
  • переопределить метод onCreate моего класса Application для определения некоторого кода следующим образом:

.

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

Ответ 1

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

ИЗМЕНИТЬ
Кажется, хорошо работает. Вот некоторый код, чтобы сделать его более ясным.
Начальный 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);
}

Ответ 2

Вот что я лично сделал для одного из моих небольших мобильных проектов. Вместо создания отдельного без экрана 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 определенно подходит для того, чтобы ваш код был более понятным для человека.