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

Условно установленная первая активность в 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>
4b9b3361

Ответ 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 не может быть загружен, то действие будет завершено немедленно, а другое действие будет запущено. Пользователь вашего приложения не заметит, что действие заставки будет завершено() сразу после действия() активности заставки, потому что в этом случае активность никогда не отображается на экране.