Условно установленная первая активность в Android
В настоящее время у нас есть заставка, отображаемая в нашем приложении. Однако, если нет данных, которые будут собраны или обработаны, которые ждут, мы хотели бы перейти прямо в нашу первую деятельность. Есть ли способ сделать это без вспышки заставки?
AndroidManifest.XML части заставки выглядит следующим образом:
<activity android:name="com.example.SplashScreenActivity"
android:label="@string/app_name"
android:noHistory="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Ответы
Ответ 1
То, что я успешно делал в прошлом, - это создать невидимую деятельность в качестве основного вида деятельности. Он никогда не отображается пользователю, потому что он запускает "правильную" активность в конструкторе.
По этой причине нет необходимости подвергать тему активности "невидимой", поскольку она не загружает представление.
Внутри я помещаю некоторую логику, которая определяет, какую активность показывать сначала пользователю. Это отлично работает для моего случая использования - попробуйте.
Декларация манифеста (обратите внимание на параметр noHistory="true"
):
<activity
android:name=".activity.EntryActivity"
android:launchMode="singleInstance"
android:noHistory="true" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
Примечание: Как указано в комментариях ниже, параметр запуска не связан с этим вопросом IIRC. Это было связано с различными путями запуска EntryActivity.
Класс EntryActivity:
public class EntryActivity extends Activity
{
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
// launch a different activity
Intent launchIntent = new Intent();
Class<?> launchActivity;
try
{
String className = getScreenClassName();
launchActivity = Class.forName(className);
}
catch (ClassNotFoundException e)
{
launchActivity = DefaultHomeActivity.class;
}
launchIntent.setClass(getApplicationContext(), launchActivity);
startActivity(launchIntent);
finish();
}
/** return Class name of Activity to show **/
private String getScreenClassName()
{
// NOTE - Place logic here to determine which screen to show next
// Default is used in this demo code
String activity = DefaultHomeActivity.class.getName();
return activity;
}
}
Ответ 2
Учитывая, что пусковая установка начнет действие, указанное в вашем манифесте, невозможно установить условия, будет ли эта активность запущена (или другой).
Итак, у вас остались варианты, как Ричард Ле Месурье и доры:
- Запустите основное действие, затем запустите действие Splash, если необходимо
- Запустите gui-less Activity (нет файла макета), затем определите, какая активность должна быть представлена пользователю.
Я бы предпочел второй вариант, или если вы планируете вводить Фрагменты в любом случае, используйте их здесь:
- Используйте
Fragments
. Начните свою основную деятельность, у которой есть место для фрагмента. Если вам нужно показать экран всплеска, загрузите SplashScreenFragment в эту активность, в противном случае загрузите фрагмент, который станет первым полезным экраном для пользователя.
В стороне, использование экранов заставки не рекомендуется; как пользователь, я бы предпочел видеть основное действие с большинством компонентов статического пользовательского интерфейса, загружаемых немедленно, и некоторые экранные указания о том, что что-то загружается/обновляется.
Ответ 3
afaik вы можете иметь только 1 основное действие.
То, что я сделал, когда у меня возникла эта проблема, всегда запускает основное действие (а не всплеск), а в методе onCreate() при необходимости запускает экран заставки.
Ответ 4
Вы можете сделать что-то вроде этого:
- Ваш Splash Screen является основным видом деятельности (Launcher-Category).
- Если ваш экран заставки может загружать данные (или что бы ни делал ваш всплывающий экран), сделайте это. По завершении закройте экран spalsh (завершение вызова()) и запустите реальное первое действие и передайте данные как дополнительные.
- Если ваш всплывающий экран не может загружать данные или (или что бы ни делал ваш заставщик), запустите следующее действие с помощью намерения и завершите работу экрана spalsh, вызвав функцию finish()
Итак, рабочий процесс вашего приложения будет следующим:
- Нажмите значок запуска
- Активность заставки всегда будет запущена.
- Если экран spalsh не может быть загружен, то действие будет завершено немедленно, а другое действие будет запущено. Пользователь вашего приложения не заметит, что действие заставки будет завершено() сразу после действия() активности заставки, потому что в этом случае активность никогда не отображается на экране.