Splash Screen (Willkommensbildschirm) für App erstellen

  • 6 Antworten
  • Letztes Antwortdatum
lordzwieback

lordzwieback

Erfahrenes Mitglied
210
Moin,

ich habe mich gestern Abend noch mal hingesetzt und ein wenig an meiner App rumgeschraubt. Unter anderem wollte ich einen Willkommensbildschirm einbauen, welcher nach ein paar Sekunden verschwindet und dann auf die MainActivity wechselt.

Da das ganze nicht wirklich schwer war und ich hier nichts dazu finden konnte, dachte ich mir ich stelle das mal hier ein. Vielleicht interessiert sich ja noch jemand dafür.

Als erstes erstellt ihr eine neue Activity (z.B. SplashActivity.java). Danach öffnet ihr eure manifest.xml Datei. Hier sollte folgendes bei eurer bisherigen StartActivity stehen:

Code:
<intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

Kommentiert diese Zeilen (nur den Intent-Filter) unter eurer Haupt Activity aus und bindet diese in eurer SplashActivity folgendermaßen ein:
Kleiner Tipp: Auskommentieren in XML Dateien = <!-- Kommentar/Code -->
Code:
<activity
            android:name=".splashActivity"
            android:screenOrientation="portrait"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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

Jetzt könnt ihr unter res/layout/ die Datei activity_splash.xml anpassen (Firmenlogo, App Name einbauen usw usw...).

Fügt jetzt im letzten Schritt die folgenden Codeschnipsel in euer SplashActivity.java File:

Code:
// timer (warte 4 sekunden bis zum Wechsel auf HauptActivity)
private static int TIMER = 4000;
// deklarieren des handlers + Runnable
final Handler mHandler = new Handler();
private Runnable mRunnable;

In OnCreate:
Code:
mHandler.postDelayed(mRunnable = new Runnable() {
    @Override
    public void run() {
        Intent toMain = new Intent(SplashActivity.this, MainActivity.class);
        startActivity(toMain);
        finish();
    }
}, TIMER);
mHandler.removeCallbacksAndMessages(null);

Im OnStop:
Code:
@Override
    protected void onStop() {
        super.onStop();
        mHandler.removeCallbacks(mRunnable);
    }

Sollte alles wie gewünscht funktionieren, kann der momentan noch auskommentierte Intent-Filter in der früheren Start Activity rausgenommen werden.

Sollte etwas an meinem Beispiel nicht stimmen oder Probleme auftauchen beim Einbauen, einfach melden. Bin für Verbesserungsvorschläge offen.

Viel Spaß beim Nachbauen,
lordzwieback
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: .mo
Hallo Lordzwieback,

vielen Dank für deinen Code.
Ich möchte nur kurz darauf hinweisen, dass SplashScreens bei Android nicht verpflichtend sind und von Google auch nicht angedacht waren.
Ich musste auch schon öfter für Kunden SplashScreens erstellen, weise sie aber auch immer wieder darauf hin.
Falls aber etwas geladen / gecached werden muss, sind SplashScreens mit Ladebalken natürlich viel besser in der Usability.
 
  • Danke
Reaktionen: lordzwieback
@Kardroid Dass sie nicht verpflichtend sind wusste ich nicht, bin aber auch nicht davon ausgegangen. Ich fand einfach, dass es dazugehört, da es bei vielen Apps, die ich selbst benutze auch drin ist. Außerdem sieht es mMn ein wenig "professioneller" oder "offizieller" aus.

Da es bei mir nur kosmetischen Nutzen hat, habe ich keinen Ladebalken oder Ähnliches eingebaut. Wenn beim Start Daten von Servern geladen oder sonstiges erledigt werden muss, könnte ein Ladebalken oder Ähnliches wohl schon von Vorteil sein, da hast du recht.
 
Hi lordzwieback,

es fehlt deiner Lösung noch ein wichtiger Teil. Im jetzigen Zustand wird der Handler nicht beendet, wenn die Activity in den Hintergrund (bzw beendet wird). Du kannst es ausprobieren, in dem du beim Start der Activity den Homebutton drückst. Der Handler wird trotzdem ausgeführt, sprich er startet die nachfolgende Activity.

Du muss den Handler beenden, wenn die Activity beendet wird. Am besten schreibst du dort, mHandler.removeCallbacksAndMessages(null). Dafür muss du dem Handler einer Variabel zuzeiweisen (Handler mHandler).
Sonst wird der Handler nie beendet, und erzeugt ein Memory Leak. In Java muß du dafür sorgen, dass alle Streams, Thread usw. wieder beendet werden, sonst kann der GC diese Objekte nicht aus den Speicher räumen, was dann irgendwann zum Absturz der App führt (Heisen-Bug).
 
  • Danke
Reaktionen: lordzwieback
@markus.tullius Hallo und danke für den Hinweis. Habe das mit dem Home Button getestet, du hattest recht.

Vorher neue Variablen am Anfang der Klasse gesetzt:
Code:
final Handler mHandler = new Handler();
private Runnable mRunnable;

Habe die Zeile folgendermaßen eingebaut:
Code:
mHandler.postDelayed(mRunnable = new Runnable() {
            @Override
            public void run() {
                Intent toMain = new Intent(splashActivity.this, MainActivity.class);
                startActivity(toMain);
                finish();
            }
        }, TIMER);

Danach den OnStop eingebaut:
Code:
@Override
    protected void onStop() {
        super.onStop();
        mHandler.removeCallbacks(mRunnable);
    }
Problem scheint somit gelöst zu sein. Nach einem Click auf den Homebutton beim Start öffnet sich nicht mehr die Folge-Activity. Habe den Code in Post#1 ebenfalls korrigiert.
 
Zuletzt bearbeitet:
  • Danke
Reaktionen: swa00
You can use thread and handler for implementing splash screen.
Sample code

Code:
 new handler (). PostDelayed (new Runnable () {
            @Override
            public void run () {
 
                Intent mainIntent = new Intent (MainActivity.this, WelcomeActivity.class);
                start activity (main intent);
                finish();
            }
        }, SPLASH_DISPLAY_LENGTH); [/ CODE]
 
Hello Ashely,

welcome in our community and thank you for your answer.
Pls note : We are a native german community and pls write in german .

BTW : This thread is very old - pls answer to newer threads

Thx a lot
 

Ähnliche Themen

koje71
Antworten
0
Aufrufe
194
koje71
koje71
CreepaZz
  • CreepaZz
Antworten
0
Aufrufe
706
CreepaZz
CreepaZz
B
  • Beka1801
Antworten
1
Aufrufe
1.072
jogimuc
J
Zurück
Oben Unten