Динамический запуск активности в Android?
есть ли способ динамически изменять начальную активность в Android на основе условно? То, что я попытался сделать (это не сработало), было следующим:
- удалите категорию запуска, как определено в моем AndroidManifest.в XML
- создайте пользовательский класс приложения, который использует приложение
- переопределите метод onCreate моего класса приложений, чтобы определить следующий код:
.
if (condition) {
startActivity(new Intent(this, MenuActivity.class));
} else {
startActivity(new Intent(this, LoginActivity.class));
}
2 ответов
почему бы не иметь инициал 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);
}
вот что я лично сделал для одного из моих небольших мобильных проектов. Вместо создания отдельного, безэкранного Activity
где условие и которое запускает соответствующий экран, я помещаю условие в один Activity
и сделал динамический setContentView()
, например:
if (!userIsLoggedIn) {
setContentView(R.layout.signup);
} else {
setContentView(R.layout.homescreen);
}
два важных примечания к этому подходу:
1: вместо того, чтобы писать, что в onCreate()
, вы хотите поместить принятие решений внутрь onResume()
именно потому, что последний всегда называется всякий раз, когда экран должен отображаться спереди. Вы можете видеть это из Android жизненный цикл деятельности. Так что если, например, пользователь просто скачал приложение и запустил его в первый раз, потому что ни один пользователь не вошел в систему, она будет вести на страницу регистрации. Когда она закончила регистрацию и по какой-то причине нажимает (не BACK
, который выходит из приложения в целом!), а затем возобновляет приложение, макет, который она увидит, уже на главном экране. Если я поставлю условное внутри onCreate()
, что бы отображалось, это экран регистрации, потому что в соответствии с жизненным циклом он не возвращается к onCreate()
при возвращении приложения на фронт.
2: это решение идеально только в том случае, если объединение функций этих двух действий не приведет к созданию длинного дьявольского блока кода. Как я уже сказал, мой проект был небольшим (его основная функция происходит в фоновом режиме), так что single dynamic Activity
не слишком много в нем. Экран-меньше Activity
Это определенно путь, если вам нужно, чтобы ваш код был более читаемым человеком.