Я хотел сделать свое приложение более профессиональным, поэтому решил, что хочу создать заставку.
Как мне его создать, а затем реализовать?
Я хотел сделать свое приложение более профессиональным, поэтому решил, что хочу создать заставку.
Как мне его создать, а затем реализовать?
Дальнейшее чтение:
Старый ответ:
В этом ответе показано, как отображать заставку в течение фиксированного периода времени, когда ваше приложение запускается, например. брендинга. Например. вы можете выбрать отображение заставки в течение 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;)
Обратите внимание, что это решение не позволит пользователю ждать больше: Задержка заставки зависит от времени запуска приложения.
Когда вы открываете какое-либо приложение для 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
ваш 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>
@Ответ Abdullah правильный, однако Google опубликовал расширенное объяснение того, как правильно реализовать это, не изменяя тему своей деятельности:
https://plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhd
Приложения, такие как Google Maps и YouTube, начали использовать тот же метод.
Ответы выше очень хорошие, но я хотел бы добавить что-то еще. Я новичок в 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();
}
}
}
счастливое кодирование!
Создайте 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>
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). Просто покажите шоу! (Просто запустите программу).
Прежде всего ответы действительно очень хорошие. Но есть проблема с утечкой памяти. Эта проблема часто известна в сообществе 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;
}
}
Для получения дополнительной информации перейдите по ссылке
Абдулла ответ велик. Но я хочу добавить несколько подробностей к нему с моим ответом.
Реализация экрана заставки
Реализация экрана заставки правильного пути немного отличается от того, что вы можете себе представить. Представление всплеска, которое вы видите, должно быть готово немедленно, даже до того, как вы сможете раздуть файл макета в своей активности всплеска.
Таким образом, вы не будете использовать файл макета. Вместо этого укажите фон с заставками в качестве фона темы деятельности. Для этого сначала создайте 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();
}
}
Это правильный путь. Я использовал эти ссылки для ответа.
Это полный код здесь
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>
Приветствия.
Заставки не должны загружаться из файла макета, все равно может быть некоторое отставание при загрузке.
Лучший способ - создать тему только для вашей 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>
После 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);
}
}
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();
}
вы не будете использовать файл макета. Вместо этого укажите фон с заставками в качестве фона темы деятельности. Для этого сначала создайте 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. Взгляд исходит из темы. Когда вы настраиваете пользовательский интерфейс для своей активности всплеска в теме, он доступен сразу.
Если у вас есть файл макета для вашей активности всплеска, этот файл макета будет отображаться для пользователя только после того, как ваше приложение будет полностью инициализировано, что слишком поздно. Вы хотите, чтобы всплеск отображался только за это небольшое количество времени до того, как приложение будет инициализировано.
Остановка на экране 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
Создайте действие, давайте действовать с именем "A", затем создадим xml файл с именем myscreen.xml, в котором задано изображение заставки в качестве фона, а затем используйте таймер обратного отсчета для перехода от одной Activitity к другой. Чтобы узнать, как использовать таймер Count Down, см. Мой ответ в этом вопросе TimerTask в Android?
Пример экрана заставки:
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);
}
}
Заставка - это немного непригодный для использования объект в 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();
}
...
}
Как насчет супергибкого экрана запуска, который может использовать один и тот же код и определен в 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();
}
}
}
Другой подход достигается с помощью 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();
}
Когда-нибудь пользователь откройте 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);
}
}
}
Надеемся на эту помощь
Хотя есть хорошие ответы, я покажу рекомендуемый 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
, если ваше изображение не мало.
Это приведет к ускорению запуска стартового экрана и спасению вас от черного экрана.
Он также избегает дополнительного переустройства
Это лучший пост, который я видел на экранах заставки: http://saulmm.github.io/avoding-android-cold-starts
Saúl Molinero использует два разных варианта экранов заставки: использование фона окна для анимации на вашем первом экране и отображение пользовательского интерфейса (это популярный выбор, который Google использует для большинства своих приложений в наши дни).
Я обращаюсь к этому сообщению каждый раз, когда мне нужно учитывать холодное время запуска и избегать выпадающего пользователя из-за длительного времени запуска.
Надеюсь, это поможет!
- 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>
Простой код, он работает:) Простой всплеск
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(LoginSuccessFull.this, LoginActivity.class));
finish();
}
}, secondsDelayed * 1500);
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);
}
}
Вывод:
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();
}
}
В моем случае я не хотел создавать новую активность только для показа изображения в течение 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
. Легко, просто, эффективно.
Я использовал потоки для создания 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();
}
}
Его очень просто в андроиде мы просто используем концепцию обработчика для реализации заставки
В вашем 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);
}