Как мне сделать заставку? - PullRequest
488 голосов
/ 30 марта 2011

Я хотел, чтобы мое приложение выглядело более профессионально, поэтому я решил создать заставку.

Как бы я его создал, а затем внедрил?

Ответы [ 31 ]

522 голосов
/ 05 апреля 2013

Обратите внимание, что это решение не позволит пользователю ждать больше: задержка заставки зависит от времени запуска приложения.

Когда вы откроете любое приложение для Android, по умолчанию вы получите черный экран с заголовком и значком приложения наверху, вы можете изменить это, используя стиль / тему.

Сначала создайте style.xml в папке значений и добавьте в него стиль.

<style name="splashScreenTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
    <item name="android:windowBackground">@drawable/splash_screen</item>
</style>

Вместо использования @android:style/Theme.DeviceDefault.Light.NoActionBar вы можете использовать любую другую тему в качестве родительской.

Во-вторых, в своем приложении Manifest.xml добавьте android:theme="@style/splashScreenTheme" к своей основной деятельности.

<activity
        android:name="MainActivity"
        android:label="@string/app_name"
        android:theme="@style/splashScreenTheme" >

В-третьих, обновите свою тему при запуске onCreate ().

protected void onCreate(Bundle savedInstanceState) {
    // Make sure this is before calling super.onCreate
    setTheme(R.style.mainAppTheme);
    super.onCreate(savedInstanceState);
}

UPDATE Проверьте это сообщение https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd Благодаря @ mat1h и @ adelriosantiago

460 голосов
/ 30 марта 2011

Дальнейшее чтение:

Старый ответ:

КАК : Простой экран-заставка

В этом ответе показано, как отображать заставку в течение фиксированного периода времени, когда ваше приложение запускается, например. причины брендинга. Например. Вы можете выбрать показ заставки в течение 3 секунд. Однако, если вы хотите показывать экран-заставку в течение различного периода времени (например, время запуска приложения), вам следует проверить ответ Абдуллы https://stackoverflow.com/a/15832037/401025. Однако имейте в виду, что запуск приложения может быть очень быстрым на новых устройствах, поэтому пользователь будет просто посмотрите вспышку, которая плохо работает UX.

Сначала вам нужно определить заставку в вашем layout.xml файле

  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
          android:orientation="vertical" android:layout_width="fill_parent"
          android:layout_height="fill_parent">

          <ImageView android:id="@+id/splashscreen" android:layout_width="wrap_content"
                  android:layout_height="fill_parent"
                  android:src="@drawable/splash"
                  android:layout_gravity="center"/>

          <TextView android:layout_width="fill_parent"
                    android:layout_height="wrap_content"
                    android:text="Hello World, splash"/>

  </LinearLayout>

А ваша деятельность:

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;

public class Splash extends Activity {

    /** Duration of wait **/
    private final int SPLASH_DISPLAY_LENGTH = 1000;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle icicle) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        /* New Handler to start the Menu-Activity 
         * and close this Splash-Screen after some seconds.*/
        new Handler().postDelayed(new Runnable(){
            @Override
            public void run() {
                /* Create an Intent that will start the Menu-Activity. */
                Intent mainIntent = new Intent(Splash.this,Menu.class);
                Splash.this.startActivity(mainIntent);
                Splash.this.finish();
            }
        }, SPLASH_DISPLAY_LENGTH);
    }
}

Вот и все;)

51 голосов
/ 30 марта 2011
  • Создание действия: Splash
  • Создание XML-файла макета: splash.xml
  • Поместите компоненты пользовательского интерфейса в макет splash.xml, чтобы он выглядел так, как вы хотите
  • ваш Splash.java может выглядеть следующим образом:

    public class Splash extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);
    
            int secondsDelayed = 1;
            new Handler().postDelayed(new Runnable() {
                    public void run() {
                            startActivity(new Intent(Splash.this, ActivityB.class));
                            finish();
                    }
            }, secondsDelayed * 1000);
        }
    }
    
  • изменить ActivityB.class на любое действие, которое вы хотите запустить после заставки

  • проверьте файл манифеста, и он должен выглядеть следующим образом:

        <activity
            android:name=".HomeScreen"
            android:label="@string/app_name">     
        </activity>

        <activity
            android:name=".Splash"
            android:label="@string/title_activity_splash_screen">     
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
28 голосов
/ 22 декабря 2014

Ответы выше очень хорошие, но я хотел бы добавить еще кое-что. Я новичок в Android, я столкнулся с этой проблемой во время моей разработки. надеюсь, это поможет кому-то вроде меня.

  1. Экран-заставка является точкой входа в мое приложение, поэтому добавьте следующие строки в AndroidManifest.xml.

        <activity
            android:name=".SplashActivity"
            android:theme="@android:style/Theme.DeviceDefault.Light.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    
  2. Заставка должна отображаться только один раз в жизненном цикле приложения, я использую логическую переменную для записи состояния заставки и показываю ее только в первый раз.

    public class SplashActivity extends Activity {
        private static boolean splashLoaded = false;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            if (!splashLoaded) {
                setContentView(R.layout.activity_splash);
                int secondsDelayed = 1;
                new Handler().postDelayed(new Runnable() {
                    public void run() {
                        startActivity(new Intent(SplashActivity.this, MainActivity.class));
                        finish();
                    }
                }, secondsDelayed * 500);
    
                splashLoaded = true;
            }
            else {
                Intent goToMainActivity = new Intent(SplashActivity.this, MainActivity.class);
                goToMainActivity.setFlags(Intent.FLAG_ACTIVITY_REORDER_TO_FRONT);
                startActivity(goToMainActivity);
                finish();
            }
        }
    }
    

Удачного кодирования!

13 голосов
/ 21 мая 2014

По умолчанию Splash Screnn не делает ваше приложение более профессиональным. Профессионально разработанный Splash Screen имеет возможность сделать ваше приложение более профессиональным, но если вы не знаете, как его написать, то насколько профессиональным будет ваше приложение.

Единственной причиной (оправданием) появления заставки является то, что вы выполняете огромное количество вычислений или ожидаете запуска GPS / WiFi, потому что ваше приложение полагается на это до запуска. Без результатов этих вычислений или доступа к GPS / WiFi (и т. Д.) Ваше приложение замертво в воде, поэтому вы чувствуете, что вам нужен экран-заставка, и ДОЛЖЕН блокировать вид экрана для любых других работающих программ (включая фоновый) ).

Такой заставочный экран должен выглядеть как ваше полноэкранное приложение, чтобы создать впечатление, что оно уже инициализировано, а затем, после продолжительных вычислений, могут быть заполнены окончательные детали (настройка изображения). вероятность того, что имеет место, или что это единственный способ, которым может быть разработана Программа , очень мала .

Было бы лучше разрешить Пользователю (и остальной части ОС) делать что-то еще, пока они ждут, а не проектировать вашу Программу, чтобы она зависела от чего-то, что займет некоторое время (когда продолжительность ожидания является неопределенной ).

На вашем телефоне уже есть значки, указывающие, что GPS / WiFi запускается. Время или пространство, занимаемое заставкой, может быть потрачено на загрузку предварительных вычислений или выполнение вычислений. См. Первую ссылку ниже, чтобы узнать о проблемах, которые вы создаете, и о том, что необходимо учитывать.

Если вам абсолютно необходимо дождаться этих вычислений или GPS / WiFi, лучше всего просто запустить приложение и открыть всплывающее окно с сообщением о том, что необходимо дождаться вычислений (текстовое сообщение «Инициализация» отлично). Ожидается ожидание GPS / WiFi (если они еще не были включены в другой программе), поэтому нет необходимости объявлять время их ожидания.

Помните, что когда запускается Splash Screen, ваша Программа фактически уже запущена, все, что вы делаете, это откладываете использование вашей Программы и заставляете CPU / GPU делать то, что большинство не считает необходимым.

Нам лучше действительно подождать и посмотреть ваш Splash Screen каждый раз, когда мы запускаем вашу Программу, или МЫ не будем чувствовать, что она написана очень профессионально. Создание экрана-заставки ПОЛНОГО экрана и дубликата фактического экрана программы (поэтому мы думаем, что он инициализирован, хотя на самом деле это не так) МОЖЕТ достичь вашей цели (сделать вашу программу более профессионально выглядящей), но я бы не стал на это сильно ставить.

Почему бы не сделать это: http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/

Как это сделать: https://encrypted.google.com/search?q=Android+splash+screen+source

Так что есть веская причина не делать этого, но если вы уверены, что каким-то образом ваша ситуация выходит за рамки этих примеров, то способы сделать это приведены выше. Будьте уверены, что это действительно делает ваше приложение более профессиональным, или вы победили единственную причину, по которой вы это сделали.

Это похоже на канал YouTube, который начинает каждое видео с длинного графического вступления (и выхода) или чувствует необходимость рассказать шутку или объяснить, что произошло на прошлой неделе (когда это не канал Comedy или LifeStyles). Просто покажи шоу! (Просто запустите программу).

13 голосов
/ 28 марта 2012
  1. Создать Activity SplashScreen.java

    public class SplashScreen extends Activity {
    protected boolean _active = true;
    protected int _splashTime = 3000; // time to display the splash screen in ms
    
    
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splashscreen);
    
        Thread splashTread = new Thread() {
            @Override
            public void run() {
                try {
                    int waited = 0;
                    while (_active && (waited < _splashTime)) {
                        sleep(100);
                        if (_active) {
                            waited += 100;
                        }
                    }
                } catch (Exception e) {
    
                } finally {
    
                    startActivity(new Intent(SplashScreen.this,
                            MainActivity.class));
                    finish();
                }
            };
                 };
        splashTread.start();
    }
     }
    
  2. splashscreen.xml будет так

    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="600px" android:layout_height="1024px"
      android:background="#FF0000">
    </RelativeLayout> 
    
12 голосов
/ 18 февраля 2016

Прежде всего ответы действительно очень хороши.Но возникают проблемы с утечкой памяти.Эта проблема часто известна в сообществе Android как «Утечка активности» .Теперь, что именно это означает?

Когда происходит изменение конфигурации, например, изменение ориентации, Android уничтожает действие и создает его заново.Обычно сборщик мусора просто очищает выделенную память старого экземпляра Activity, и у нас все хорошо.

«Утечка активности» относится к ситуации, когда сборщик мусора не может очиститьвыделенная память старого экземпляра Activity, поскольку она being (strong) referenced от объекта, который прожил экземпляр Activity.Каждому приложению Android выделено определенное количество памяти.Когда сборщик мусора не может освободить неиспользуемую память, производительность приложения будет постепенно снижаться и в конечном итоге произойдет сбой с ошибкой OutOfMemory.

Как определить, утечка памяти приложением или нет?Самый быстрый способ - открыть вкладку «Память» в Android Studio и обратить внимание на выделенную память при изменении ориентации.Если выделенная память продолжает увеличиваться и никогда не уменьшается, возникает утечка памяти.

1. Утечка памяти при изменении ориентации пользователя.enter image description here

Сначала необходимо определить заставку в ресурсе макета splashscreen.xml файл

Пример кода для активности заставки.

public class Splash extends Activity {
 // 1. Create a static nested class that extends Runnable to start the main Activity
    private static class StartMainActivityRunnable implements Runnable {
        // 2. Make sure we keep the source Activity as a WeakReference (more on that later)
        private WeakReference mActivity;

        private StartMainActivityRunnable(Activity activity) {
         mActivity = new WeakReference(activity);
        }

        @Override
        public void run() {
         // 3. Check that the reference is valid and execute the code
            if (mActivity.get() != null) {
             Activity activity = mActivity.get();
             Intent mainIntent = new Intent(activity, MainActivity.class);
             activity.startActivity(mainIntent);
             activity.finish();
            }
        }
    }

    /** Duration of wait **/
    private final int SPLASH_DISPLAY_LENGTH = 1000;

    // 4. Declare the Handler as a member variable
    private Handler mHandler = new Handler();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(icicle);
        setContentView(R.layout.splashscreen);

        // 5. Pass a new instance of StartMainActivityRunnable with reference to 'this'.
        mHandler.postDelayed(new StartMainActivityRunnable(this), SPLASH_DISPLAY_LENGTH);
    }

    // 6. Override onDestroy()
    @Override
    public void onDestroy() {
     // 7. Remove any delayed Runnable(s) and prevent them from executing.
     mHandler.removeCallbacksAndMessages(null);

     // 8. Eagerly clear mHandler allocated memory
     mHandler = null;
    }
}

Для получения дополнительной информации перейдите по этой ссылке

10 голосов
/ 06 августа 2016

Ответ Абдуллы велик. Но я хочу добавить к этому еще несколько деталей своим ответом.

Реализация заставки

Правильная реализация заставки немного отличается от того, что вы можете себе представить. Отображаемое всплывающее окно должно быть готово немедленно, даже до того, как вы сможете надуть файл макета в своей всплывающей активности.

Таким образом, вы не будете использовать файл макета. Вместо этого укажите фон заставки в качестве фона темы действия. Для этого сначала создайте XML drawable в res / drawable.

background_splash.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item
        android:drawable="@color/gray"/>

    <item>
        <bitmap
            android:gravity="center"
            android:src="@mipmap/ic_launcher"/>
    </item>

</layer-list>

Это просто список слоев с логотипом в центре цвета фона с ним.

Теперь откройте файл styles.xml и добавьте этот стиль

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
        <item name="android:windowBackground">@drawable/background_splash</item>
</style>

Эта тема будет на панели действий и с фоном, который мы только что создали.

И в манифесте вам нужно настроить SplashTheme на активность, которую вы хотите использовать в качестве заставки.

<activity
android:name=".SplashActivity"
android:theme="@style/SplashTheme">
<intent-filter>
    <action android:name="android.intent.action.MAIN" />

    <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>

Затем внутри вашего кода активности перейдите к конкретному экрану после заставки с помощью намерения.

public class SplashActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = new Intent(this, MainActivity.class);
        startActivity(intent);
        finish();
    }
}

Это правильный способ сделать. Я использовал эти ссылки для ответа.

  1. https://material.google.com/patterns/launch-screens.html
  2. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ Спасибо этим ребятам за то, что подтолкнули меня в правильном направлении. Я хочу помочь другим, потому что принятый ответ не рекомендуется использовать в качестве заставки.
4 голосов
/ 13 февраля 2016

Это полный код здесь

SplashActivity.java

public class SplashActivity extends AppCompatActivity {

private final int SPLASH_DISPLAY_DURATION = 1000;

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);


    new Handler().postDelayed(new Runnable(){
        @Override
        public void run() {

            Intent mainIntent = new Intent(SplashActivity.this,MainActivity.class);
            SplashActivity.this.startActivity(mainIntent);
            SplashActivity.this.finish();
        }
    }, SPLASH_DISPLAY_DURATION);
}}

В Drawables создайте bg_splash.xml

<?xml version="1.0" encoding="utf-8"?><layer-list xmlns:android="http://schemas.android.com/apk/res/android">

<item
    android:drawable="@color/app_color"/>

<item>
    <bitmap
        android:gravity="center"
        android:src="@drawable/ic_in_app_logo_big"/>
</item></layer-list>

В styles.xml создать собственную тему

<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
    <item name="android:windowBackground">@drawable/bg_splash</item>
</style>

и, наконец, в AndroidManifest.xml укажите тему для своей деятельности

<activity
        android:name=".activities.SplashActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:theme="@style/SplashTheme">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

Приветствие.

4 голосов
/ 11 августа 2016

Заставки не следует загружать из файла макета, возможно, при загрузке все еще может быть некоторая задержка.

Лучший способ - создать тему только для SplashScreenActivity и установить для the android:windowBackground ресурс для рисования.

https://www.bignerdranch.com/blog/splash-screens-the-right-way/

В двух словах:

Объявите свою SplashScreenActivity в манифесте:

<activity
        android:name=".activities.SplashScreenActivity"
        android:theme="@style/SplashTheme"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

В вашем SplashScreenActivity.java:

@Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = new Intent(this, MainActivity_.class);
    startActivity(intent);
    finish();

}

Далее создайте ресурс для фонового окна вашей темы:

<style name="SplashTheme" parent="Theme.Bumpfie.Base">
    <item name="android:windowBackground">@drawable/splash</item>
</style>

Drawable файл splash.xml:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:drawable="@android:color/white"/>
    <item>
        <bitmap
            android:gravity="center"
            android:src="@drawable/app_logo"/>
    </item>
</layer-list>
...