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

Как создать заставку?

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

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

4b9b3361

Ответ 1

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

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

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

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

Сначала вам нужно определить spash-экран в файле 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);
    }
}

Thats all;)

Ответ 2

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

Когда вы открываете какое-либо приложение для 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

Ответ 3

  • Создайте действие: 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>

Ответ 4

@Ответ Abdullah правильный, однако Google опубликовал расширенное объяснение того, как правильно реализовать это, не изменяя тему своей деятельности:

https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd

Приложения, такие как Google Maps и YouTube, начали использовать тот же метод.

Ответ 5

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

  • Экран Splash - это точка входа моего приложения, поэтому добавьте следующие строки в 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>
    
  • Заставка должна отображаться только один раз в жизненном цикле приложения, я использую логическую переменную для записи состояния заставки и показываю ее только в первый раз.

    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();
            }
        }
    }
    

счастливое кодирование!

Ответ 6

  • Создайте 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();
    }
     }
    
  • 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> 
    

Ответ 7

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

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

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

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

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

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

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

Нам бы очень хотелось подождать и посмотреть ваш экран Splash каждый раз, когда мы начнем вашу программу, или мы не почувствуем, что это очень профессионально написано. Создание экрана всплывающего экрана FULL 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, который запускает каждое видео с длинным графическим вводом (и Outro) или чувствует необходимость рассказать анекдот или объяснить, что произошло на прошлой неделе (когда это не комедия или канал LifeStyles). Просто покажите шоу! (Просто запустите программу).

Ответ 8

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

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

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

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

1. Потеря памяти при изменении ориентации. введите описание изображения здесь

Сначала вам нужно определить заставку в файле компоновки 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;
    }
}

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

Ответ 9

Абдулла ответ велик. Но я хочу добавить несколько подробностей к нему с моим ответом.

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

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

Таким образом, вы не будете использовать файл макета. Вместо этого укажите фон с заставками в качестве фона темы деятельности. Для этого сначала создайте XML с возможностью рисования в 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();
    }
}

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

Ответ 10

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

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>

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

Ответ 11

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

Лучший способ - создать тему только для вашей 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>

Жесткий файл 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>

Ответ 12

После Android Marshmallow другое полезное использование экрана Splash, о котором я придумываю, - это , запрашивающий необходимый Android Permissions в заставке вашего приложения.

похоже, что большинство приложений обрабатывают запрос разрешения таким образом.

  • Диалоги делают плохой UIX, и они нарушают основной поток и заставляют вас выбирать время выполнения, и правда, большинство пользователей, возможно, даже не заботятся о том, что ваше приложение хочет что-то написать на SD-карте. Некоторые из них, возможно, даже не понимают, что мы пытаемся передать, пока не переведем его на простой английский.

  • Запрос разрешений за один раз делает меньшее количество "if else" перед каждой операцией и делает ваш код бесполезным.

Это пример того, как вы можете запрашивать разрешения в вашей активности всплеска для устройства под управлением ОС Android 23+.

Если все разрешения предоставлены ИЛИ уже предоставлены ИЛИ приложение работает на Pre Marshmallow THEN, просто перейдите и отобразите основное содержимое с небольшой задержкой в ​​полсекунды, чтобы пользователь мог оценить усилие, которое мы поставили при чтении этого вопроса и попытке приложить все усилия.

import android.Manifest;
import android.annotation.TargetApi;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.widget.Toast;

import com.c2h5oh.beer.R;
import com.c2h5oh.beer.utils.Animatrix;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class SplashActivity extends AppCompatActivity {

    final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);

        //show animations 
        Animatrix.scale(findViewById(R.id.title_play), 100);
        Animatrix.scale(findViewById(R.id.title_edit), 100);
        Animatrix.scale(findViewById(R.id.title_record), 100);
        Animatrix.scale(findViewById(R.id.title_share), 100);

        if (Build.VERSION.SDK_INT >= 23) {

            // Marshmallow+ Permission APIs
            fuckMarshMallow();

        } else {

            // Pre-Marshmallow
            ///Display main contents
            displaySplashScreen();
        }
    }

    @Override
    public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {
                Map<String, Integer> perms = new HashMap<String, Integer>();
                // Initial
                perms.put(Manifest.permission.READ_EXTERNAL_STORAGE, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.RECORD_AUDIO, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.MODIFY_AUDIO_SETTINGS, PackageManager.PERMISSION_GRANTED);
                perms.put(Manifest.permission.VIBRATE, PackageManager.PERMISSION_GRANTED);
                // Fill with results
                for (int i = 0; i < permissions.length; i++)
                    perms.put(permissions[i], grantResults[i]);

                // Check for ACCESS_FINE_LOCATION
                if (perms.get(Manifest.permission.READ_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.RECORD_AUDIO) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.MODIFY_AUDIO_SETTINGS) == PackageManager.PERMISSION_GRANTED
                        && perms.get(Manifest.permission.VIBRATE) == PackageManager.PERMISSION_GRANTED) {
                    // All Permissions Granted

                    // Permission Denied
                    Toast.makeText(SplashActivity.this, "All Permission GRANTED !! Thank You :)", Toast.LENGTH_SHORT)
                            .show();

                    displaySplashScreen();

                } else {
                    // Permission Denied
                    Toast.makeText(SplashActivity.this, "One or More Permissions are DENIED Exiting App :(", Toast.LENGTH_SHORT)
                            .show();

                    finish();
                }
            }
            break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }


    @TargetApi(Build.VERSION_CODES.M)
    private void fuckMarshMallow() {
        List<String> permissionsNeeded = new ArrayList<String>();

        final List<String> permissionsList = new ArrayList<String>();
        if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE))
            permissionsNeeded.add("Read SD Card");
        if (!addPermission(permissionsList, Manifest.permission.RECORD_AUDIO))
            permissionsNeeded.add("Record Audio");
        if (!addPermission(permissionsList, Manifest.permission.MODIFY_AUDIO_SETTINGS))
            permissionsNeeded.add("Equilizer");
        if (!addPermission(permissionsList, Manifest.permission.VIBRATE))
            permissionsNeeded.add("Vibrate");

        if (permissionsList.size() > 0) {
            if (permissionsNeeded.size() > 0) {

                // Need Rationale
                String message = "App need access to " + permissionsNeeded.get(0);

                for (int i = 1; i < permissionsNeeded.size(); i++)
                    message = message + ", " + permissionsNeeded.get(i);

                showMessageOKCancel(message,
                        new DialogInterface.OnClickListener() {

                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                                        REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
                            }
                        });
                return;
            }
            requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),
                    REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);
            return;
        }

        Toast.makeText(SplashActivity.this, "No new Permission Required- Launching App .You are Awesome!!", Toast.LENGTH_SHORT)
                .show();

        displaySplashScreen();
    }


    private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {
        new AlertDialog.Builder(SplashActivity.this)
                .setMessage(message)
                .setPositiveButton("OK", okListener)
                .setNegativeButton("Cancel", null)
                .create()
                .show();
    }

    @TargetApi(Build.VERSION_CODES.M)
    private boolean addPermission(List<String> permissionsList, String permission) {

        if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {
            permissionsList.add(permission);
            // Check for Rationale Option
            if (!shouldShowRequestPermissionRationale(permission))
                return false;
        }
        return true;
    }

    /**
     * Display main content with little delay just so that user can see
     * efforts I put to make this page
     */
    private void displaySplashScreen() {
        new Handler().postDelayed(new Runnable() {

        /*
         * Showing splash screen with a timer. This will be useful when you
         * want to show case your app logo / company
         */

            @Override
            public void run() {
                startActivity(new Intent(SplashActivity.this, AudioPlayerActivity.class));
                finish();
            }
        }, 500);
    }


}

Ответ 13

public class MainActivity extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Thread t=new Thread()
    {

        public void run()
        {   

            try {

                sleep(2000);
                finish();
                Intent cv=new Intent(MainActivity.this,HomeScreen.class/*otherclass*/);
                startActivity(cv);
            } 

            catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    };
    t.start();
}

Ответ 14

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

Примечание: доступен весь код ниже ссылка GitHub

<?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>

Здесь Ive установил цвет фона и изображение.

Затем вы установите это как фоновый эффект всплеска в теме. Перейдите к файлу styles.xml и добавьте новую тему для активности всплеска:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

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

</resources>

В новом SplashTheme установите атрибут фона окна для вашего XML-ресурса. Настройте это как тему активности всплесков в вашем AndroidManifest.xml:

<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>
</activity>

Наконец, ваш класс SplashActivity должен просто перенаправлять вас на ваш основной вид деятельности:

public class SplashActivity extends AppCompatActivity {

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

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

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

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

Ответ 15

Остановка на экране Splash для 4 5 без необходимости не имеет большого смысла. Хорошо, если вы загружаете что-то в фоновом режиме, следуйте этому подходу для реализации заставки: - Реализация экрана заставки правильного пути немного отличается от того, что вы можете себе представить. Представление всплеска, которое вы видите, должно быть готово немедленно, даже до того, как вы сможете раздуть файл макета в своей активности всплеска.

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

<?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>

Здесь Ive установил цвет фона и изображение.

Затем вы установите это как фоновый эффект всплеска в теме. Перейдите к файлу styles.xml и добавьте новую тему для активности всплеска:

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
    </style>

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

</resources>

В новом SplashTheme установите атрибут фона окна для вашего XML-ресурса. Настройте это как тему активности всплесков в вашем AndroidManifest.xml:

<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>
</activity>

Наконец, класс SplashActivity должен просто перенаправлять вас на ваш основной вид деятельности:

     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://www.bignerdranch.com/blog/splash-screens-the-right-way/ 2. http://blog.goodbarber.com/3-tips-to-create-a-great-splash-screen-for-your-mobile-app_a287.html

Ответ 16

Создайте действие, давайте действовать с именем "A", затем создадим xml файл с именем myscreen.xml, в котором задано изображение заставки в качестве фона, а затем используйте таймер обратного отсчета для перехода от одной Activitity к другой. Чтобы узнать, как использовать таймер Count Down, см. Мой ответ в этом вопросе TimerTask в Android?

Ответ 17

Пример экрана заставки:

public class MainActivity extends Activity {
    private ImageView splashImageView;
    boolean splashloading = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        splashImageView = new ImageView(this);
        splashImageView.setScaleType(ScaleType.FIT_XY);
        splashImageView.setImageResource(R.drawable.ic_launcher);
        setContentView(splashImageView);
        splashloading = true;
        Handler h = new Handler();
        h.postDelayed(new Runnable() {
            public void run() {
                splashloading = false;
                setContentView(R.layout.activity_main);
            }

        }, 3000);

    }

}

Ответ 18

Заставка - это немного непригодный для использования объект в Android: он не может быть загружен как можно скорее для скрытия задержки запуска основной активности. Для этого есть две причины: реклама и сетевые операции.

Реализация в качестве диалога позволяет без промедления перейти от экрана всплеска к основному пользовательскому интерфейсу активности.

public class SplashDialog extends Dialog {
    ImageView splashscreen;
    SplashLoader loader;
    int splashTime = 4000;

    public SplashDialog(Context context, int theme) {
        super(context, theme);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_splash);
        setCancelable(false);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                cancel();
            }
        }, splashTime);

    }
}

Разметка:

<?xml version="1.0" encoding="utf-8"?>

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@color/white">

    <ImageView
        android:id="@+id/splashscreen"
        android:layout_width="190dp"
        android:layout_height="190dp"
        android:background="@drawable/whistle"
        android:layout_centerInParent="true" />

</RelativeLayout>

И начните:

public class MyActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        if (getIntent().getCategories() != null &&  getIntent().getCategories().contains("android.intent.category.LAUNCHER")) {
            showSplashScreen();
        }
    }

    protected Dialog splashDialog;
    protected void showSplashScreen() {
        splashDialog = new SplashDialog(this, R.style.SplashScreen);
        splashDialog.show();
    }

    ...
}

Ответ 19

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

<activity
        android:name=".SplashActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
        <meta-data android:name="launch_class" android:value="com.mypackage.MyFirstActivity" />
        <meta-data android:name="duration" android:value="5000" />
</activity>

Затем сам SpashActivity просматривает метаданные для "launch_class", чтобы затем сделать сам Intent. "Длительность" метаданных определяет, как долго экран заставки будет оставаться.

public class SplashActivity extends Activity {

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

    ComponentName componentName = new ComponentName(this, this.getClass());

    try {
        Bundle bundle = null;
        bundle = getPackageManager().getActivityInfo(componentName, PackageManager.GET_META_DATA).metaData;
        String launch_class = bundle.getString("launch_class");
        //default of 2 seconds, otherwise defined in manifest
        int duration = bundle.getInt("duration", 2000);

        if(launch_class != null) {
            try {
                final Class<?> c = Class.forName(launch_class);

                new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
                        Intent intent = new Intent(SplashActivity.this, c);
                        startActivity(intent);
                        finish();
                    }
                }, duration);

            } catch (ClassNotFoundException e) {
                e.printStackTrace();
            }
        }
    } catch (PackageManager.NameNotFoundException e) {
        e.printStackTrace();
    }
  }
}

Ответ 20

Другой подход достигается с помощью CountDownTimer

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

 new CountDownTimer(5000, 1000) { //5 seconds
      public void onTick(long millisUntilFinished) {
          mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
      }

     public void onFinish() {
          startActivity(new Intent(SplashActivity.this, MainActivity.class));
          finish();
     }

  }.start();
}

Ответ 21

Когда-нибудь пользователь откройте SplashActivity и немедленно уйдет, но приложение по-прежнему переходит к MainActivity после SPLASH_SCREEN_DISPLAY_LENGTH.

Для предотвращения этого: В SplashActivity вы должны проверить, что SplashActivity заканчивается или нет, перед переходом на MainActivity

public class SplashActivity extends Activity {

    private final int SPLASH_SCREEN_DISPLAY_LENGTH = 2000;

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

                if (!isFinishing()) {//isFinishing(): If the activity is finishing, returns true; else returns false.
                    startActivity(new Intent(SplashActivity.this, MainActivity.class));
                    finish();
                }

            }, SPLASH_SCREEN_DISPLAY_LENGTH);
        }                             
   }                                
}

Надеемся на эту помощь

Ответ 22

Хотя есть хорошие ответы, я покажу рекомендуемый Google вариант:

1) Сначала создайте Theme для заставки:  у вас есть тема под названием splashscreenTheme, ваша тема для запуска:

<style name="splashscreenTheme">
  <item name="android:windowBackground">@drawable/launch_screen</item>
</style>

Примечание:

android:windowBackground уже устанавливает ваше изображение с заставкой без экрана   необходимо сделать это в интерфейсе пользователя.

вы также можете использовать цвет здесь, а не для рисования.

2) Задайте тему для проявления splashscreenActivity

   <activity
            android:name=".activity.splashscreenActivity"
            android:screenOrientation="portrait"
            android:theme="@style/splashscreenTheme">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

3) убедитесь, что файл launch_screen drawable не находится в папке drawable, если ваше изображение не мало.

Это приведет к ускорению запуска стартового экрана и спасению вас от черного экрана.

Он также избегает дополнительного переустройства

Ответ 23

Это лучший пост, который я видел на экранах заставки: http://saulmm.github.io/avoding-android-cold-starts

Saúl Molinero использует два разных варианта экранов заставки: использование фона окна для анимации на вашем первом экране и отображение пользовательского интерфейса (это популярный выбор, который Google использует для большинства своих приложений в наши дни).

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

Надеюсь, это поможет!

Ответ 24

     - Add in SplashActivity 

   public class SplashActivity extends Activity {

       private ProgressBar progressBar;
       int i=0;
       Context context;
       private GoogleApiClient googleApiClient;

       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_splash);
           context = this;

           new Handler().postDelayed(new Runnable() {
               @Override
               public void run() {
                   startActivity(new Intent(Splash.this, LoginActivity.class));
                   finish();
               }
           }, 2000);

       }

   }

  - Add in activity_splash.xml

   <RelativeLayout
   xmlns:android="http://schemas.android.com/apk/res/android"
       xmlns:tools="http://schemas.android.com/tools"
       xmlns:custom="http://schemas.android.com/apk/res-auto"
       android:background="@color/colorAccent"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       tools:context=".Splash">

       <ImageView
           android:id="@+id/ivLogo"
           android:layout_width="match_parent"
           android:layout_height="match_parent"
           android:src="@mipmap/icon_splash"
           android:layout_centerHorizontal="true"
           android:layout_centerVertical="true"/>


       <ProgressBar
           android:id="@+id/circle_progress"
           style="?android:attr/progressBarStyleHorizontal"
           android:layout_width="fill_parent"
           android:layout_height="wrap_content"
           android:layout_alignParentBottom="true"
           android:layout_marginBottom="5dp"
           android:max="100"
           android:progressTint="@color/green"
           android:visibility="visible" />

   </RelativeLayout>

  - Add in AndroidManifest.xml

    <activity android:name="ex.com.SplashActivity">
               <intent-filter>
                   <action android:name="android.intent.action.MAIN" />

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

Ответ 25

Простой код, он работает:) Простой всплеск

int secondsDelayed = 1;
    new Handler().postDelayed(new Runnable() {
        public void run() {
            startActivity(new Intent(LoginSuccessFull.this, LoginActivity.class));
            finish();
        }
    }, secondsDelayed * 1500);

Ответ 26

activity_splash.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@drawable/gradient_background" >

<ImageView
    android:id="@+id/imgLogo"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_centerInParent="true"
    android:src="@drawable/wwe_logo" />

<TextView
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_marginBottom="10dp"
    android:textSize="12dp"
    android:textColor="#454545"
    android:gravity="center_horizontal"
    android:layout_alignParentBottom="true"
    android:text="www.androidhive.info" />

</RelativeLayout>

SplashScreen.java

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

public class SplashScreen extends Activity {


// Splash screen timer
private static int SPLASH_TIME_OUT = 3000;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    new Handler().postDelayed(new Runnable() {

        /*
         * Showing splash screen with a timer. This will be useful when you
         * want to show case your app logo / company
         */

        @Override
        public void run() {
            // This method will be executed once the timer is over
            // Start your app main activity
            Intent i = new Intent(SplashScreen.this, MainActivity.class);
            startActivity(i);

            // close this activity
            finish();
        }
    }, SPLASH_TIME_OUT);
 }

}

Вывод:

введите описание изображения здесь

Ответ 27

public class SplashActivity extends Activity {

  Context ctx;

  @Override
  protected void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      ctx = this;
      setContentView(R.layout.activity_splash);

      Thread thread = new Thread(){
          public void run(){
              try {
                  sleep(3000);
              } catch (InterruptedException e) {
                  e.printStackTrace();
              }

              Intent in = new Intent(ctx,MainActivity.class);
              startActivity(in);
              finish();
          }
      };
      thread.start();
  }
}

Ответ 28

В моем случае я не хотел создавать новую активность только для показа изображения в течение 2 секунд. При запуске my MainAvtivity изображения загружаются в держатели с использованием picasso, я знаю, что для загрузки занимает около 1 секунды, поэтому я решил сделать следующее внутри моей MainActivity OnCreate:

splashImage = (ImageView) findViewById(R.id.spllll);

    this.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);

    int secondsDelayed = 1;
    new Handler().postDelayed(new Runnable() {
        public void run() {
            getWindow().clearFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN);
            splashImage.setVisibility(View.GONE);

        }
    }, secondsDelayed * 2000);

При запуске приложения происходит первое, что происходит, когда отображается сообщение ImageView, а statusBar удаляется установкой флажков окна в полноэкранный режим. Затем я использовал Handler для запуска в течение 2 секунд, после 2 секунд я очищаю флаги полного экрана и устанавливаю видимость от ImageView до GONE. Легко, просто, эффективно.

Ответ 29

Я использовал потоки для создания Flash-экрана в android.

    import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v7.app.AppCompatActivity;

public class HomeScreen extends AppCompatActivity{
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.screen_home);

        Thread thread = new Thread(){
            public void run(){
                try {
                    Thread.sleep(3 * 1000);
                    Intent i = new Intent(HomeScreen.this, MainActivity.class);
                    startActivity(i);
                } catch (InterruptedException e) {
                }
            }
        };
        thread.start();
    }
}

Ответ 30

Его очень просто в андроиде мы просто используем концепцию обработчика для реализации заставки

В вашем java файле SplashScreenActivity вставьте этот код.

В вашем файле SplashScreenActivity xml поместите любое изображение с помощью imageview.

public void LoadScreen() {
        final Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {                 
                Intent i = new Intent(SplashScreenActivity.this, AgilanbuGameOptionsActivity.class);
                startActivity(i);
            }
        }, 2000);
    }