Uygulamamın daha profesyonel görünmesini istedim, bu yüzden bir açılış ekranı yapmaya karar verdim.
Nasıl yaratıp sonra uygularım?
Uygulamamın daha profesyonel görünmesini istedim, bu yüzden bir açılış ekranı yapmaya karar verdim.
Nasıl yaratıp sonra uygularım?
Yanıtlar:
Daha fazla okuma:
Eski cevap:
NASIL YAPILIR : Basit açılış ekranı
Bu cevaplar, örneğin markalama nedenleriyle uygulamanız başladığında belirli bir süre için açılış ekranının nasıl görüntüleneceğini gösterir. Örneğin, açılış ekranını 3 saniye boyunca göstermeyi seçebilirsiniz. Ancak, spash ekranını değişken bir süre için göstermek istiyorsanız (örn. Uygulama başlangıç zamanı) Abdullah'ın cevabını https://stackoverflow.com/a/15832037/401025 kontrol etmelisiniz . Bununla birlikte, uygulamanın yeni cihazlarda çok hızlı olabileceğini unutmayın, böylece kullanıcı sadece kötü UX olan bir flaş görür.
Öncelikle layout.xml
dosyanızdaki spash ekranını tanımlamanız gerekir
<?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>
Ve faaliyetiniz:
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);
}
}
Bu kadar ;)
SPLASH_DISPLAY_LENGTH
Zaman için uygulamayı durdurmak yerine . Bunun yerine şunu yapmalısınız
Bu çözümün kullanıcının daha fazla beklemesine izin vermeyeceğini unutmayın: açılış ekranının gecikmesi uygulamanın başlangıç zamanına bağlıdır.
Herhangi bir android uygulamasını açtığınızda, varsayılan olarak üstte uygulamanın başlığı ve simgesi olan ne siyah bir ekran alırsınız, bir stil / tema kullanarak bunu değiştirebilirsiniz.
İlk olarak, değerler klasöründe bir style.xml dosyası oluşturun ve bu klasöre bir stil ekleyin.
<style name="splashScreenTheme" parent="@android:style/Theme.DeviceDefault.Light.NoActionBar">
<item name="android:windowBackground">@drawable/splash_screen</item>
</style>
Kullanmak yerine @android:style/Theme.DeviceDefault.Light.NoActionBar
başka bir temayı üst öğe olarak kullanabilirsiniz.
İkinci olarak, uygulamanızda Manifest.xml android:theme="@style/splashScreenTheme"
ana faaliyetinize ekleyin .
<activity
android:name="MainActivity"
android:label="@string/app_name"
android:theme="@style/splashScreenTheme" >
Üçüncü olarak, temanızı onCreate () başlatma etkinliğinizde güncelleyin.
protected void onCreate(Bundle savedInstanceState) {
// Make sure this is before calling super.onCreate
setTheme(R.style.mainAppTheme);
super.onCreate(savedInstanceState);
}
GÜNCELLEME Bu gönderiye göz atın .
@ Mat1h ve @adelriosantiago sayesinde
<item name="android:background">
, geçersiz kılmak olduğunu windowBackground
. Ve android:background
tanımlanmadan, herhangi bir parçadaki arka planım, ön plan içeriğinin arkasındaki etkinliği ortaya çıkarmak için şeffaf olacaktır.
Splash.java'nız şöyle görünebilir:
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
açılış ekranından sonra başlatmak istediğiniz etkinliğe değiştirin
manifest dosyanızı kontrol edin ve şöyle görünmelidir
<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>
Yukarıdaki cevaplar çok iyi, ama başka bir şey daha eklemek istiyorum. Android'de yeniyim, gelişimim sırasında bu sorunla karşılaştım. Umarım bu benim gibi birine yardımcı olabilir.
Açılış ekranı, uygulamamın giriş noktasıdır, bu nedenle AndroidManifest.xml dosyasına aşağıdaki satırları ekleyin.
<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>
Açılış ekranı uygulama yaşam döngüsünde yalnızca bir kez gösterilmelidir, açılış ekranının durumunu kaydetmek için bir boole değişkeni kullanıyorum ve sadece ilk kez göstereceğim.
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();
}
}
}
mutlu kodlama!
android:noHistory="true"
içinde AndroidManifest.xml
geri düğmesini kullanarak giriş ekranı için geri gitmekten kullanıcıyı engellemek için.
Abdullah'ın cevabı harika. Ama cevabımla biraz daha detay eklemek istiyorum.
Açılış Ekranı Uygulama
Açılış ekranını doğru şekilde uygulamak hayal edebileceğinizden biraz farklıdır. Açılış etkinliğinizde bir düzen dosyasını şişirebilmeniz için bile gördüğünüz açılış görünümü hemen hazır olmalıdır.
Böylece bir düzen dosyası kullanmayacaksınız. Bunun yerine, açılış ekranınızın arka planını etkinliğin tema arka planı olarak belirtin. Bunu yapmak için, önce res / drawable içinde çizilebilir bir XML oluşturun.
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>
Sadece arka plan rengi ile logo ile bir katman listesi.
Şimdi styles.xml dosyasını açın ve bu stili ekleyin
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
Bu temanın yukarıda oluşturduğumuz eylem çubuğuna ve arka plana sahip olması gerekir.
Ve manifest'te SplashTheme'i sıçrama olarak kullanmak istediğiniz etkinliğe ayarlamanız gerekir.
<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>
Ardından etkinlik kodunuzun içinde, amacı kullanarak açılıştan sonra kullanıcıyı belirli bir ekrana yönlendirin.
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Bunu yapmanın doğru yolu bu. Bu referansları cevap için kullandım.
YouTube
ilgili bir eğitim gördüm . Ancak bitmap boyutunun sorun olacağını düşünüyorum çünkü kullanarak yeniden boyutlandıramazsınız layer-list
.
Oluşturduğunuz bir 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
böyle olacak
<?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, varsayılan olarak Uygulamanızın otomatik olarak daha profesyonel görünmesini sağlamaz. Profesyonelce tasarlanmış bir Açılış Ekranı, Uygulamanızı daha profesyonel hale getirme olasılığına sahiptir, ancak nasıl yazılacağını bilmiyorsanız, Uygulamanızın geri kalanı ne kadar profesyonel olacaktır.
Açılış Ekranına sahip olmanın tek nedeni (Bahane), Uygulamanızın başlamadan önce buna bağlı olması nedeniyle büyük miktarda Hesaplama yapmanız veya GPS / WiFi'nin başlamasını beklemenizdir. Bu Hesaplamalar veya GPS / WiFi (vb.) Erişimi olmadan Uygulamanız suda öldü, bu nedenle bir Splash Screen'e ihtiyacınız olduğunu hissediyorsunuz ve diğer çalışan Programlar (Arka Plan dahil) için Ekranın görünümünü engellemeniz GEREKİR ).
Böyle bir Açılış Ekranı, zaten başlatıldığı izlenimini vermek için Tam Ekran Uygulamanıza benzemelidir, daha sonra uzun hesaplamalar tamamlandıktan sonra nihai ayrıntılar doldurulabilir (Görüntü düzeltildi). Bu durumda olma veya Programın tasarlanabilmesinin tek yolu olma şansı çok azdır .
Kullanıcının (ve işletim sisteminin geri kalanının), Programınızı biraz zaman alacak bir şeye (beklemenin süresi belirsiz olduğunda) bağımlı olacak şekilde tasarlamak yerine, beklerken başka bir şey yapmasına izin vermek daha iyi olacaktır.
Telefonunuzda zaten GPS / WiFi'nin başladığını söyleyen Simgeler var. Açılış Ekranı tarafından harcanan zaman veya alan, ön hesaplamaları yüklemek veya aslında Hesaplamaları yapmak için harcanabilir. Oluşturduğunuz sorunlar ve nelere dikkat edilmesi gerektiği konusunda aşağıdaki ilk Bağlantıya bakın.
Bu Hesaplamaları veya GPS / WiFi'yi kesinlikle beklemeniz gerekiyorsa, Uygulamanın başlamasına izin vermek ve Hesaplamaları beklemenin gerekli olduğunu belirten bir pop-up'a sahip olmak en iyisi olacaktır (TEKSTİL "Başlatılıyor" Mesajı iyidir). GPS / WiFi için bekleme bekleniyor (zaten başka bir Programda etkinleştirilmemişlerse), bu nedenle bekleme sürelerini bildirmek gereksizdir.
Açılış Ekranı başladığında, Programınız zaten zaten çalışıyorsa, tek yaptığınız Programınızın kullanımını geciktirmek ve CPU / GPU'yu en fazla gerekli olmayan bir şey yapmak için zorlamaktır.
Programınızı her başlattığımızda gerçekten Splash Screen'inizi beklemek ve görmek istersek daha iyi olur ya da BİZ profesyonelce yazıldığını hissetmeyiz. Açılış Ekranını DOLU Ekran ve gerçek Programın Ekranının bir kopyası yapmak (aslında olmadığında başlatıldığını düşünüyoruz) hedefinize ulaşabilir (Programınızın daha profesyonel görünmesini sağlamak) ama bunun üzerine çok fazla bahis oynamam.
Neden yapmıyorsunuz: http://cyrilmottier.com/2012/05/03/splash-screens-are-evil-dont-use-them/
Nasıl yapılır: https://encrypted.google.com/search?q=Android+splash+screen+source
Bu yüzden bunu yapmamak için iyi bir neden var, ancak durumunuzun bir şekilde bu örneklerin dışında kaldığından eminseniz, bunu yapmanın yolu yukarıda verilmiştir. Uygulamanızın daha profesyonel görünmesini sağladığından veya bunu yapmak için verdiğiniz tek nedeni yendiğinizden emin olun.
Her Videoyu uzun bir Grafik Girişiyle (ve Outro'yla) başlatan veya geçen hafta boyunca (Komedi veya LifeStyles Kanalı olmadığında) bir Şaka söyleme veya ne olduğunu açıklama ihtiyacı hisseden bir YouTube Kanalı gibidir. Sadece şovu göster! (Sadece Programı çalıştırın).
Her şeyden önce cevaplar gerçekten çok iyi. Ancak bellek sızıntısıyla karşılaşma sorunu var. Bu sorun genellikle Android topluluğunda "Etkinlik Sızdırma" olarak bilinir . Şimdi bu tam olarak ne anlama geliyor?
Yönlendirme değişikliği gibi yapılandırma değişikliği meydana geldiğinde Android, Etkinliği yok eder ve yeniden oluşturur. Normalde, Çöp Toplayıcı eski Etkinlik örneğinin ayrılan belleğini temizler ve hepimiz iyiyiz.
"Bir Etkinliği Sızdırmak" , Çöp Toplayıcı'nın eski Etkinlik örneğinin ayrılan belleğini, Etkinlik örneğini being (strong) referenced
yaşayan bir nesneden temizleyemediği durum anlamına gelir . Her Android uygulamasının kendisine ayrılan belirli bir belleği vardır. Çöp Toplayıcı kullanılmayan belleği boşaltamazsa, uygulamanın performansı yavaş yavaş azalacak ve sonunda OutOfMemory
hata ile çökecektir.
Uygulamanın bellek sızdırıp sızdırmadığını nasıl belirleyebilirim? En hızlı yol, Android Studio'da Bellek sekmesini açmak ve yönlendirmeyi değiştirirken ayrılan belleğe dikkat etmektir. Ayrılan bellek artmaya devam ederse ve asla azalmazsa, bellek sızıntısı olur.
1. kullanıcı yönünü değiştirdiğinde hafıza sızıntısı.
Öncelikle düzen kaynak splashscreen.xml
dosyanızdaki açılış ekranını tanımlamanız gerekir
Açılış ekranı etkinliği için örnek kod.
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;
}
}
Daha fazla bilgi için lütfen bu bağlantıyı inceleyin
Sıçrama ekranında 4'lerin 5'leri durdurmak gereksizdir. Arka planda başka bir şey yüklüyorsanız, açılış ekranını uygulamak için bu yaklaşımı izleyin: - Açılış ekranını doğru şekilde uygulamak hayal edebileceğinizden biraz farklıdır. Açılış etkinliğinizde bir düzen dosyasını şişirebilmeniz için bile gördüğünüz açılış görünümü hemen hazır olmalıdır.
Böylece bir düzen dosyası kullanmayacaksınız. Bunun yerine, açılış ekranınızın arka planını etkinliğin tema arka planı olarak belirtin. Bunu yapmak için, önce res / drawable içinde çizilebilir bir XML oluşturun.
<?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>
Burada bir arka plan rengi ve görüntü ayarladım.
Daha sonra, bunu açılış etkinliğinizin temada arka planı olarak ayarlayacaksınız. Styles.xml dosyanıza gidin ve açılış etkinliğiniz için yeni bir tema ekleyin:
<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>
Yeni SplashTheme'inizde, pencere arka plan özniteliğini XML'nizin çekilebilir olarak ayarlayın. Bunu AndroidManifest.xml dosyasında sıçrama etkinliğinizin teması olarak yapılandırın:
<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>
Son olarak, SplashActivity sınıfı sizi ana etkinliğinize yönlendirmelidir:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Daha fazla ayrıntı bunu okuyun: 1. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ 2. http://blog.goodbarber.com/3-tips-to-create-a -büyük-sıçrama ekran-for-your-mobil-app_a287.html
Buradaki kodun tamamı
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);
}}
Çekmecelerde bu bg_splash.xml dosyasını oluşturun
<?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>
Gelen styles.xml özel bir tema oluşturmak
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/bg_splash</item>
</style>
ve son olarak AndroidManifest.xml dosyasında etkinliğiniz için temayı belirtin
<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>
Şerefe.
drawable
Açılış ekranları bir mizanpaj dosyasından yüklenmemelidir, yüklenirken hala biraz gecikme olabilir.
En iyi yol, yalnızca SplashScreenActivity'niz için bir Tema oluşturmak ve the android:windowBackground
çekilebilir bir kaynağa ayarlamaktır .
https://www.bignerdranch.com/blog/splash-screens-the-right-way/
Kısaca:
Manifest'te SplashScreenActivity'nizi bildirin:
<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'nızda:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity_.class);
startActivity(intent);
finish();
}
Ardından temanızın arka plan penceresi için kaynak oluşturun:
<style name="SplashTheme" parent="Theme.Bumpfie.Base">
<item name="android:windowBackground">@drawable/splash</item>
</style>
Çekilebilir dosya 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'dan sonra , düşündüğüm diğer Splash ekranının Verimli kullanımı, uygulamanızın açılış ekranında gerekliAndroid Permissions
olmasını istiyor .
uygulamaların çoğunun izin isteğini bu şekilde ele aldığı görülüyor.
İletişim kutuları kötü UIX yapar ve ana akışı keser ve çalışma zamanında karar vermenizi sağlar ve gerçek şu ki, çoğu kullanıcı uygulamanız SD karta bir şey yazmak istiyorsa bile umursamayabilir. Bazıları, onu düz ingilizce tercüme edene kadar ne aktarmaya çalıştığımızı bile anlamayabilir.
Bir seferde izin istemek, her işlemden önce daha az sayıda "if" olursa ve kodunuzun dağınık görünmesini sağlar.
Bu, Android OS 23+ çalıştıran cihaz için açılış etkinliğinizde nasıl izin isteyebileceğinizi gösteren bir örnektir.
Tüm izinler verildiyse VEYA zaten verildiyse VEYA uygulaması Pre Marshmallow'da çalışıyor SONRA sadece kullanıcılara bu soruyu okuma ve elimizden gelenin en iyisini yapmaya çalıştığımız çabayı takdir edebilmeleri için ana içerikleri sadece yarım saniyelik bir gecikmeyle görüntüleyin.
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);
}
}
bir düzen dosyası kullanmayacaksınız. Bunun yerine, açılış ekranınızın arka planını etkinliğin tema arka planı olarak belirtin. Bunu yapmak için, önce res / drawable içinde çizilebilir bir XML oluşturun.
Not: aşağıdaki tüm kodlar kullanılabilir GitHub Link
<?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>
Burada bir arka plan rengi ve görüntü ayarladım.
Daha sonra, bunu açılış etkinliğinizin temada arka planı olarak ayarlayacaksınız. Styles.xml dosyanıza gidin ve açılış etkinliğiniz için yeni bir tema ekleyin:
<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>
Yeni SplashTheme'inizde, pencere arka plan özniteliğini XML'nizin çekilebilir olarak ayarlayın. Bunu AndroidManifest.xml dosyasında sıçrama etkinliğinizin teması olarak yapılandırın:
<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>
Son olarak, SplashActivity sınıfınız sizi ana etkinliğinize yönlendirmelidir:
public class SplashActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
finish();
}
}
Bu SplashActivity için bir görünüm bile ayarlamadığınıza dikkat edin. Görünüm temadan geliyor. Temadaki sıçrama etkinliğiniz için kullanıcı arayüzünü ayarladığınızda, hemen kullanılabilir.
Açılış etkinliğiniz için bir düzen dosyanız varsa, bu düzen dosyası yalnızca uygulamanız tamamen başlatıldıktan sonra çok geç olan kullanıcı tarafından görülebilir. Sıçramaların yalnızca uygulama başlatılmadan önce çok az bir sürede görüntülenmesini istiyorsunuz.
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();
}
Bir Etkinlik oluşturun, 'A' adlı Etkinliği bize bırakın, ardından myscreen.xml adlı bir xml dosyası oluşturun, bu dosyada bir açılış ekranı görüntüsünü arka plan olarak ayarlayın ve sonra bir Etkinlikten diğerine gitmek için geri sayım sayacını kullanın. Geri Sayım sayacını nasıl kullanacağınızı öğrenmek için bu soruya cevabımı TimerTask Android'de görebilirsiniz?
Açılış ekranı örneği:
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);
}
}
Açılış ekranı Android'de biraz kullanılamaz bir nesnedir: ana faaliyetin başlamasının gecikmesini gizlemek için mümkün olan en kısa sürede yüklenemez. Bunu kullanmanın iki nedeni vardır: reklam ve ağ işlemleri.
Diyalog olarak uygulama, açılış ekranından ana faaliyet arayüzüne gecikmeden atlama yapar.
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);
}
}
Yerleşim:
<?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>
Ve başla:
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();
}
...
}
Başka bir yaklaşım CountDownTimer kullanılarak elde edilir
@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();
}
- 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>
Gerçekten kolay ve gr8 yaklaşımı:
İlk olarak aşağıdaki web sitesiyle sıçramalarınızı oluşturun:
https://www.norio.be/android-feature-graphic-generator/
Logonuzu ve sloganınızı seçin, güzel arka planınızı seçin. 4096x4096 olarak yeniden boyutlandırın.
Şimdi bu resmi indirin ve güncelleyin:
https://apetools.webprofusion.com/app/#/tools/imagegorilla
Ve gerekli tüm açılış ekranlarını, tüm cihazları, tüm platformları oluşturun.
Zevk almak!
Burada uygulamaya yardımcı olacak yeterli cevap var. bu yazı, açılış ekranını oluşturmanın ilk adımında başkalarına yardımcı olmayı amaçlıyordu!
Aynı kodu kullanabilen ve AndroidManifest.xml'de tanımlanan süper esnek bir başlatma ekranına ne dersiniz, bu yüzden kodun asla değişmesi gerekmeyecek. Ben genellikle kod kütüphaneleri geliştirmek ve özensiz olduğundan kodu özelleştirme sevmiyorum.
<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>
Daha sonra SpashActivity'nin kendisi "Launch_class" meta verisini arar ve sonra da Niyet'i kendisi yapar. Meta veri "süresi", açılış ekranının ne kadar kalacağını tanımlar.
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();
}
}
}
Bazen kullanıcı açmak SplashActivity
ve hemen çıkın ancak uygulama halen gidin MainActivity
sonra SPLASH_SCREEN_DISPLAY_LENGTH
.
Bunu önlemek için: içinde taşımadan önce bitmiş olup olmadığını SplashActivity
kontrol etmelisinizSplashActivity
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);
}
}
}
Umarım bu yardım
İyi cevaplar olmasına rağmen, google'ın önerilen yolunu göstereceğim:
1) İlk Theme
olarak açılış ekranı oluşturun: adlı bir temanız var splashscreenTheme
, başlatıcı temanız şöyle olacaktır:
<style name="splashscreenTheme">
<item name="android:windowBackground">@drawable/launch_screen</item>
</style>
Not:
android:windowBackground
açılış ekranı görüntünüzü zaten
UI'de tekrar yapmaya gerek yok.
burada çekilebilir yerine renk de kullanabilirsiniz.
2) Temayı, açılış ekranının tezahürüne ayarlayın
<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) emin olun launch_screen drawable
değil drawable
resminizin küçük değilse klasörde.
Daha hızlı başlatma ekranının başlatılmasına ve sizi siyah ekrandan kurtarmanıza neden olur
Ayrıca ekstra fazla çekilmeyi önler
Bu, açılış ekranlarında gördüğüm en iyi gönderi: http://saulmm.github.io/avoding-android-cold-starts
Saúl Molinero, açılış ekranları için iki farklı seçeneğe gider: Başlangıç ekranınıza animasyon uygulamak için pencere arka planından yararlanma ve yer tutucu kullanıcı arayüzünü görüntüleme (Google'ın bu günlerde uygulamalarının çoğu için kullandığı popüler bir seçimdir).
Her seferinde soğuk başlangıç zamanını düşünmem ve uzun başlatma süreleri nedeniyle kullanıcının terk etmesini önlemem gerektiğinde bu gönderiye başvuruyorum.
Bu yardımcı olur umarım!
Benim durumumda, sadece 2 saniye boyunca bir görüntü göstermek için yeni bir Etkinlik oluşturmak istemedim. Başlarken MainAvtivity
, resimler picasso kullanarak tutuculara yüklenir, bunun yüklenmesi yaklaşık 1 saniye sürer, bu yüzden MainActivity'mde aşağıdakileri yapmaya karar verdim 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);
Uygulama başlatılırken gerçekleşen ilk şey ImageView
, pencere bayraklarını tam ekrana ayarlayarak görüntülenen ve statusBar öğelerinin kaldırılmasıdır. Sonra bir kullanılmış Handler
, 2 saniye daha çalışmaya 2 saniye sonra tam ekran bayrakları temizlemek ve görünürlüğünü ayarlamak ImageView
için GONE
. Kolay, basit, etkili.
Android'de gerçekten basit, sadece açılış ekranını uygulamak için işleyici kavramını kullanıyoruz
Senin içinde SplashScreenActivity java dosyasına bu kodu yapıştırın.
Senin içinde SplashScreenActivity xml dosyasında ImageView kullanarak herhangi bir resim koydu.
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);
}
Bunu onCreate Yönteminize ekleyebilirsiniz
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
// going to next activity
Intent i=new Intent(SplashScreenActivity.this,MainActivity.class);
startActivity(i);
finish();
}
},time);
Ve zaman değerinizi istediğiniz gibi milisaniye olarak başlatın ...
private static int time=5000;
daha fazla ayrıntı için bu linkten tam kodu indirin ...
Kotlin'de bu kodu yazın: -
Handler().postDelayed({
val mainIntent = Intent(this@SplashActivity, LoginActivity::class.java)
startActivity(mainIntent)
finish()
}, 500)
Umarım bu size yardımcı olacaktır.Teşekkürler ........
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();
}
}