Динамическая активность запуска в Android?
Есть ли способ динамически изменить начальную активность в Android на основе условно? То, что я попытался сделать (это не сработало), было следующим:
- удалите категорию LAUNCHER, как определено в моем AndroidManifest.xml
- создать собственный класс приложений, который использует приложение
- переопределить метод onCreate моего класса Application для определения некоторого кода следующим образом:
.
if (condition) {
startActivity(new Intent(this, MenuActivity.class));
} else {
startActivity(new Intent(this, LoginActivity.class));
}
Ответы
Ответ 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
определенно подходит для того, чтобы ваш код был более понятным для человека.