ฉันต้องการทำให้แอพของฉันดูเป็นมืออาชีพมากขึ้นฉันจึงตัดสินใจว่าต้องการสร้างหน้าจอสาด
ฉันจะสร้างมันขึ้นมาและนำไปใช้ได้อย่างไร
ฉันต้องการทำให้แอพของฉันดูเป็นมืออาชีพมากขึ้นฉันจึงตัดสินใจว่าต้องการสร้างหน้าจอสาด
ฉันจะสร้างมันขึ้นมาและนำไปใช้ได้อย่างไร
คำตอบ:
อ่านเพิ่มเติม:
คำตอบเก่า:
HOW TO : หน้าจอเริ่มต้นที่เรียบง่าย
คำตอบนี้แสดงวิธีการแสดงหน้าจอสแปลชเป็นระยะเวลาที่แน่นอนเมื่อแอปของคุณเริ่มต้นด้วยเหตุผลด้านการสร้างแบรนด์ เช่นคุณอาจเลือกที่จะแสดงหน้าจอเป็นเวลา 3 วินาที แต่ถ้าคุณต้องการที่จะแสดงหน้าจอ spash สำหรับจำนวนเงินที่ตัวแปรของเวลา (เช่นแอปเริ่มต้นเวลา) คุณควรตรวจสอบคำตอบอับดุลลาห์https://stackoverflow.com/a/15832037/401025 อย่างไรก็ตามโปรดทราบว่าการเริ่มต้นแอพอาจเร็วมากสำหรับอุปกรณ์ใหม่ดังนั้นผู้ใช้จะเห็นแฟลชที่ไม่ดี UX
ก่อนอื่นคุณต้องกำหนดหน้าจอสแปลชในlayout.xml
ไฟล์ของคุณ
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent">
<ImageView android:id="@+id/splashscreen" android:layout_width="wrap_content"
android:layout_height="fill_parent"
android:src="@drawable/splash"
android:layout_gravity="center"/>
<TextView android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="Hello World, splash"/>
</LinearLayout>
และกิจกรรมของคุณ:
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
public class Splash extends Activity {
/** Duration of wait **/
private final int SPLASH_DISPLAY_LENGTH = 1000;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.splashscreen);
/* New Handler to start the Menu-Activity
* and close this Splash-Screen after some seconds.*/
new Handler().postDelayed(new Runnable(){
@Override
public void run() {
/* Create an Intent that will start the Menu-Activity. */
Intent mainIntent = new Intent(Splash.this,Menu.class);
Splash.this.startActivity(mainIntent);
Splash.this.finish();
}
}, SPLASH_DISPLAY_LENGTH);
}
}
นั่นคือทั้งหมด;)
SPLASH_DISPLAY_LENGTH
พ คุณควรทำสิ่งนี้แทน: bignerdranch.com/blog/splash-screens-the-right-way
หมายเหตุวิธีแก้ไขปัญหานี้จะไม่ยอมให้ผู้ใช้รออีกต่อไป:ความล่าช้าของหน้าจอสแปลชขึ้นอยู่กับเวลาเริ่มต้นของแอปพลิเคชัน
เมื่อคุณเปิดแอพ 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);
}
อัพเดท ดูโพสต์นี้
ขอบคุณ @ mat1h และ @adelriosantiago
<item name="android:background">
windowBackground
และหากไม่มีการandroid:background
กำหนดพื้นหลังของฉันในส่วนใด ๆ จะโปร่งใสเปิดเผยกิจกรรมที่อยู่เบื้องหลังเนื้อหาเบื้องหน้า
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>
คำตอบข้างต้นนั้นดีมาก แต่ฉันต้องการเพิ่มอย่างอื่น ฉันใหม่สำหรับ 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();
}
}
}
การเข้ารหัสมีความสุข!
android:noHistory="true"
ในAndroidManifest.xml
เพื่อป้องกันไม่ให้ผู้ใช้จากการที่จะกลับไปหน้าจอโดยใช้ปุ่มย้อนกลับ
คำตอบของ Abdullah นั้นยอดเยี่ยมมาก แต่ฉันต้องการเพิ่มรายละเอียดเพิ่มเติมด้วยคำตอบของฉัน
การใช้หน้าจอเริ่มต้น
การนำหน้าจอสแปลชมาใช้อย่างถูกวิธีนั้นแตกต่างจากที่คุณคิดเล็กน้อย มุมมองสแปลชที่คุณเห็นจะต้องพร้อมใช้งานทันทีก่อนที่คุณจะสามารถขยายไฟล์เลย์เอาต์ในกิจกรรมสาดของคุณ
ดังนั้นคุณจะไม่ใช้ไฟล์เลย์เอาต์ ให้ระบุพื้นหลังของหน้าจอสแปลชเป็นพื้นหลังของธีมของกิจกรรมแทน เมื่อต้องการทำสิ่งนี้ก่อนอื่นให้สร้าง XML drawable ใน res / drawable
background_splash.xml
<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:drawable="@color/gray"/>
<item>
<bitmap
android:gravity="center"
android:src="@mipmap/ic_launcher"/>
</item>
</layer-list>
มันเป็นเพียงเลเยอร์ที่มีโลโก้เป็นสีพื้นหลังตรงกลางด้วย
ตอนนี้เปิด styles.xml และเพิ่มสไตล์นี้
<style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
<item name="android:windowBackground">@drawable/background_splash</item>
</style>
ชุดรูปแบบนี้จะต้องมีแถบการกระทำและมีพื้นหลังที่เราเพิ่งสร้างขึ้นด้านบน
และในรายการคุณต้องตั้ง SplashTheme เป็นกิจกรรมที่คุณต้องการใช้เป็น splash
<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();
}
}
นั่นเป็นวิธีที่เหมาะสมในการทำ ฉันใช้การอ้างอิงเหล่านี้เพื่อหาคำตอบ
YouTube
เกี่ยวกับเรื่องนี้ layer-list
แต่ผมคิดว่าขนาดบิตแมปจะเป็นปัญหาตั้งแต่คุณไม่สามารถปรับขนาดได้โดยใช้
สร้าง 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 ที่ออกแบบอย่างมืออาชีพมีความเป็นไปได้ในการทำให้แอปพลิเคชันของคุณดูเป็นมืออาชีพมากขึ้น แต่ถ้าคุณไม่รู้วิธีเขียนหนึ่งแอปพลิเคชันที่เหลือจะเป็นมืออาชีพจริง ๆ
เกี่ยวกับเหตุผลเดียว (ข้อแก้ตัว) ที่จะมีหน้าจอ Splash คือเนื่องจากคุณกำลังทำการคำนวณจำนวนมากหรือกำลังรอ GPS / WiFi เพื่อเริ่มต้นเนื่องจากแอปพลิเคชันของคุณใช้ก่อนที่จะเริ่มต้น หากไม่มีผลลัพธ์จากการคำนวณหรือการเข้าถึง GPS / WiFi (ฯลฯ ) แอปพลิเคชันของคุณเสียชีวิตในน้ำคุณจึงรู้สึกว่าจำเป็นต้องมีหน้าจอ Splash และต้องปิดกั้นมุมมองหน้าจอสำหรับโปรแกรมที่ทำงานอื่น ๆ (รวมถึงพื้นหลัง )
หน้าจอ Splash ดังกล่าวควรดูเหมือนแอปพลิเคชันแบบเต็มหน้าจอของคุณเพื่อสร้างความประทับใจว่าได้เริ่มต้นแล้วจากนั้นหลังจากการคำนวณที่มีความยาวเสร็จสมบูรณ์รายละเอียดขั้นสุดท้ายสามารถกรอกได้ โอกาสที่เป็นกรณีหรือว่ามันเป็นเพียงวิธีการที่โครงการจะได้รับการออกแบบที่มีขนาดเล็กอันยิ่งใหญ่
เป็นการดีกว่าที่จะอนุญาตให้ผู้ใช้ (และส่วนที่เหลือของระบบปฏิบัติการ) ทำอย่างอื่นในขณะที่พวกเขารอแทนที่จะออกแบบโปรแกรมของคุณขึ้นอยู่กับสิ่งที่จะใช้เวลาสักครู่ (เมื่อระยะเวลาของการรอคอยไม่แน่นอน)
มีไอคอนในโทรศัพท์ของคุณแล้วที่บอกว่า GPS / WiFi กำลังเริ่มต้น เวลาหรือพื้นที่ที่ใช้ในหน้าจอ Splash อาจใช้เวลาโหลดการคำนวณล่วงหน้าหรือทำการคำนวณจริง ดูลิงค์แรกด้านล่างสำหรับปัญหาที่คุณสร้างและสิ่งที่ต้องพิจารณา
หากคุณต้องรอการคำนวณหรือ GPS / WiFi เหล่านี้เป็นการดีที่สุดที่จะปล่อยให้แอปพลิเคชันเริ่มต้นและมีป๊อปอัปที่แจ้งว่าจำเป็นต้องรอการคำนวณ (ข้อความ "กำลังเริ่มต้น" เป็นสิ่งที่ดี) คาดว่าจะรอ GPS / WiFi (หากไม่ได้เปิดใช้งานในโปรแกรมอื่นอยู่แล้ว) ดังนั้นการประกาศเวลารอจะไม่จำเป็น
โปรดจำไว้ว่าเมื่อหน้าจอ Splash เริ่มต้นโปรแกรมของคุณกำลังทำงานจริง ๆ แล้วสิ่งที่คุณกำลังทำอยู่คือการล่าช้าการใช้งานโปรแกรมของคุณและใช้ CPU / GPU เพื่อทำสิ่งที่ไม่รู้สึกว่าจำเป็นที่สุด
เราต้องการรอและดู Splash Screen ของคุณดีกว่าทุกครั้งที่เราเริ่มโปรแกรมของคุณหรือเราจะไม่รู้สึกว่ามันถูกเขียนขึ้นอย่างมืออาชีพ การทำให้หน้าจอเต็มรูปแบบ Splash และสำเนาของหน้าจอโปรแกรมจริง (ดังนั้นเราจึงคิดว่าจะเริ่มต้นได้เมื่อมันไม่จริง) อาจบรรลุเป้าหมายของคุณ (ในการทำให้โปรแกรมของคุณดูเป็นมืออาชีพมากขึ้น) แต่ฉันจะไม่วางเดิมพัน
ทำไมไม่ทำ: 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) ที่มีความยาวหรือรู้สึกว่าต้องบอกเรื่องตลกหรืออธิบายสิ่งที่เกิดขึ้นในช่วงสัปดาห์ที่ผ่านมา เพียงแสดงรายการ! (เพียงเรียกใช้โปรแกรม)
เหนือคำตอบทั้งหมดเป็นสิ่งที่ดีมากจริงๆ แต่มีปัญหาการรั่วของหน่วยความจำ ปัญหานี้มักจะเป็นที่รู้จักกันในชุมชน Android เช่น"รั่วกิจกรรม" ตอนนี้หมายความว่าอย่างไร
เมื่อการเปลี่ยนแปลงการกำหนดค่าเกิดขึ้นเช่นการเปลี่ยนทิศทาง Android จะทำลายกิจกรรมและสร้างมันขึ้นมาใหม่ โดยปกติแล้ว Garbage Collector จะล้างหน่วยความจำที่จัดสรรไว้ของอินสแตนซ์กิจกรรมเก่าและเราก็ทำได้ดี
"การรั่วไหลของกิจกรรม"หมายถึงสถานการณ์ที่ Garbage Collector ไม่สามารถล้างหน่วยความจำที่จัดสรรของอินสแตนซ์ของกิจกรรมเก่าเนื่องจากมันbeing (strong) referenced
มาจากวัตถุที่อยู่นอกอินสแตนซ์ของกิจกรรม แอพ Android ทุกตัวมีหน่วยความจำตามจำนวนที่จัดสรรไว้ เมื่อ Garbage Collector ไม่สามารถเพิ่มหน่วยความจำที่ไม่ได้ใช้งานได้ประสิทธิภาพของแอพจะลดลงทีละน้อยและในที่สุดก็เกิด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;
}
}
สำหรับข้อมูลเพิ่มเติมโปรดไปที่ลิงค์นี้
การหยุดบนหน้าจอ Splash สำหรับ 4 ใน 5 ไม่จำเป็นโดยไม่จำเป็น ไม่เป็นไรถ้าคุณโหลดบางอย่างในพื้นหลังให้ทำตามวิธีนี้เพื่อใช้หน้าจอเริ่มต้น: - การนำหน้าจอสแปลชไปใช้วิธีที่ถูกต้องจะแตกต่างจากที่คุณคิดเล็กน้อย มุมมองสแปลชที่คุณเห็นจะต้องพร้อมใช้งานทันทีก่อนที่คุณจะสามารถขยายไฟล์เลย์เอาต์ในกิจกรรมสาดของคุณ
ดังนั้นคุณจะไม่ใช้ไฟล์เลย์เอาต์ ให้ระบุพื้นหลังของหน้าจอสแปลชเป็นพื้นหลังของธีมของกิจกรรมแทน เมื่อต้องการทำสิ่งนี้ขั้นแรกให้สร้าง XML drawable ใน 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>
ที่นี่ฉันได้ตั้งค่าสีพื้นหลังและรูปภาพ
ถัดไปคุณจะตั้งค่านี้เป็นพื้นหลังของกิจกรรมสาดในธีม นำทางไปยังไฟล์ 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 drawable ของคุณ กำหนดค่านี้เป็นธีมของกิจกรรมสาดใน 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 สาดน้ำหน้าจอสำหรับของคุณโทรศัพท์มือถือ app_a287.html
นี่คือรหัสเต็มที่นี่
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);
}}
ใน drawable สร้าง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>
ไชโย
drawable
ไม่ควรโหลดหน้าจอสแปลชจากไฟล์เลย์เอาต์อาจมีความล่าช้าเมื่อโหลด
วิธีที่ดีที่สุดคือการสร้างชุดรูปแบบสำหรับ 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();
}
ถัดไปสร้าง ressource สำหรับหน้าต่างพื้นหลังของธีมของคุณ:
<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 บางคนอาจไม่เข้าใจสิ่งที่เราพยายามสื่อจนกระทั่งเราแปลเป็นภาษาอังกฤษธรรมดา
การขออนุญาตในครั้งเดียวจะทำให้จำนวน "น้อยลง" ก่อนการดำเนินการทุกครั้งและทำให้รหัสของคุณดูยุ่งเหยิง
นี่คือตัวอย่างของวิธีที่คุณสามารถขออนุญาตในกิจกรรมสแปลชของคุณสำหรับอุปกรณ์ที่ใช้ Android OS 23+
หากสิทธิ์ทั้งหมดได้รับอนุญาตหรือได้รับอนุญาตแล้วหรือแอปทำงานบน Pre Marshmallow จากนั้นไปและแสดงเนื้อหาหลักด้วยความล่าช้าเล็กน้อยครึ่งวินาทีเพื่อให้ผู้ใช้สามารถชื่นชมความพยายามที่เราได้พยายามอ่านคำถามนี้และพยายามทำให้ดีที่สุด
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);
}
}
คุณจะไม่ใช้ไฟล์เลย์เอาต์ ให้ระบุพื้นหลังของหน้าจอสแปลชเป็นพื้นหลังของธีมของกิจกรรมแทน เมื่อต้องการทำสิ่งนี้ก่อนอื่นให้สร้าง XML drawable ใน 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>
ที่นี่ฉันได้ตั้งค่าสีพื้นหลังและรูปภาพ
ถัดไปคุณจะตั้งค่านี้เป็นพื้นหลังของกิจกรรมสาดในธีม นำทางไปยังไฟล์ 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 drawable ของคุณ กำหนดค่านี้เป็นธีมของกิจกรรมสาดใน 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 นี้ มุมมองมาจากชุดรูปแบบ เมื่อคุณตั้งค่า UI สำหรับกิจกรรมสาดของคุณในชุดรูปแบบจะมีให้ใช้งานทันที
หากคุณมีไฟล์เลย์เอาต์สำหรับกิจกรรมสาดของคุณไฟล์เลย์เอาต์นั้นจะปรากฏให้ผู้ใช้เห็นหลังจากที่แอปของคุณได้รับการเริ่มต้นอย่างสมบูรณ์ซึ่งช้าเกินไป คุณต้องการให้สแปลชแสดงผลในเวลาเพียงเล็กน้อยเท่านั้นก่อนที่แอปจะเริ่มต้น
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();
}
สร้างกิจกรรมให้เรากิจกรรมที่ชื่อว่า 'A' จากนั้นสร้างไฟล์ xml ชื่อ myscreen.xml ในการตั้งค่าภาพหน้าจอสแปลเป็นพื้นหลังแล้วใช้ตัวจับเวลานับถอยหลังเพื่อนำทางจาก Activtity หนึ่งไปยังอีก หากต้องการทราบวิธีใช้ตัวจับเวลาถอยหลังดูคำตอบของฉันในคำถามนี้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: ไม่สามารถโหลดได้โดยเร็วที่สุดสำหรับการซ่อนความล่าช้าของกิจกรรมหลักที่เริ่มต้น มีสองเหตุผลในการใช้งาน: การโฆษณาและการดำเนินงานเครือข่าย
การนำไปใช้เป็นกล่องโต้ตอบจะทำให้การกระโดดโดยไม่ชักช้าจากหน้าจอเริ่มต้นไปยัง UI หลักของกิจกรรม
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();
}
...
}
วิธีการอื่นทำได้โดยใช้ 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();
}
- 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>
ง่ายมาก & วิธี gr8:
ขั้นแรกสร้างสแปลชของคุณด้วยเว็บไซต์ต่อไปนี้:
https://www.norio.be/android-feature-graphic-generator/
เลือกโลโก้และสโลแกนของคุณเลือกพื้นหลังที่สวยงามของคุณ ปรับขนาดเป็น 4096x4096
ตอนนี้ดาวน์โหลดรูปภาพนั้นและอัปเดตเป็น:
https://apetools.webprofusion.com/app/#/tools/imagegorilla
และสร้างหน้าจอสแปลชทั้งหมดที่จำเป็นอุปกรณ์ทั้งหมดแพลตฟอร์มทั้งหมด
สนุก!
มีคำตอบที่เพียงพอที่จะช่วยในการดำเนินการ โพสต์นี้มีไว้เพื่อช่วยเหลือผู้อื่นในขั้นตอนแรกของการสร้างหน้าจอเริ่มต้น!
วิธีการเกี่ยวกับหน้าจอเรียกใช้งานที่ยืดหยุ่นเป็นพิเศษซึ่งสามารถใช้รหัสเดียวกันและกำหนดไว้ใน 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 จะค้นหา meta-data สำหรับ "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();
}
}
}
ผู้ใช้บางครั้งเปิดSplashActivity
และเลิกทันที แต่ app ยังคงไปหลังจาก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
ตั้งค่าภาพ splashscreen ของคุณแล้วโดยไม่
จำเป็นต้องทำสิ่งนี้ใน UI อีกครั้ง
คุณยังสามารถใช้สีที่นี่แทน drawable
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 มีสองตัวเลือกที่แตกต่างกันสำหรับหน้าจอเริ่มต้น: ใช้ประโยชน์จากพื้นหลังหน้าต่างเพื่อทำให้เคลื่อนไหวในหน้าจอเริ่มต้นของคุณและแสดง UI ตัวยึด (ซึ่งเป็นตัวเลือกยอดนิยมที่ Google ใช้กับแอพส่วนใหญ่ในปัจจุบัน)
ฉันอ้างถึงโพสต์นี้ทุกครั้งที่ฉันต้องพิจารณาเวลาเริ่มเย็นและหลีกเลี่ยงการออกจากผู้ใช้เนื่องจากเวลาเริ่มต้นนาน
หวังว่านี่จะช่วยได้!
ในกรณีของฉันฉันไม่ต้องการสร้างกิจกรรมใหม่เพียงเพื่อแสดงภาพเป็นเวลา 2 วินาที เมื่อเริ่มต้นของฉัน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
ง่ายเรียบง่ายมีประสิทธิภาพ
มันง่ายมากใน Android เราเพียงแค่ใช้ตัวจัดการแนวคิดเพื่อใช้หน้าจอเริ่มต้น
ใน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);
}
คุณสามารถเพิ่มสิ่งนี้ในวิธีการสร้างของคุณ
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);
และเริ่มต้นมูลค่าเวลาของคุณในหน่วยมิลลิวินาทีตามที่คุณต้องการ ...
private static int time=5000;
สำหรับรายละเอียดเพิ่มเติมดาวน์โหลดรหัสเต็มจากลิงค์นี้ ...
ใน Kotlin เขียนรหัสนี้: -
Handler().postDelayed({
val mainIntent = Intent(this@SplashActivity, LoginActivity::class.java)
startActivity(mainIntent)
finish()
}, 500)
หวังว่านี่จะช่วยคุณได้ขอบคุณ ........
Simple Code มันใช้งานได้ :) Simple splash
int secondsDelayed = 1;
new Handler().postDelayed(new Runnable() {
public void run() {
startActivity(new Intent(LoginSuccessFull.this, LoginActivity.class));
finish();
}
}, secondsDelayed * 1500);
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();
}
}