ฉันจะสร้างหน้าจอเริ่มต้นได้อย่างไร


548

ฉันต้องการทำให้แอพของฉันดูเป็นมืออาชีพมากขึ้นฉันจึงตัดสินใจว่าต้องการสร้างหน้าจอสาด

ฉันจะสร้างมันขึ้นมาและนำไปใช้ได้อย่างไร


58
เหตุใดแอปพลิเคชันดูเป็นมืออาชีพมากขึ้นโดยใช้หน้าจอสแปลช ฉันรู้ว่าไม่มีแอพพลิเคชั่น Android สำหรับมืออาชีพ
theomega

7
เห็นด้วยกับ @theomega หน้าจอสแปลชธรรมดาน่ารำคาญ
Matt Ball

85
คุณควรแสดงหน้าจอเริ่มต้นเฉพาะเมื่อคุณมีงานโหลดพื้นหลังที่ต้องทำ มิฉะนั้นแอปของคุณจะดูเป็น "มืออาชีพ" มากขึ้นเมื่อคุณให้สิ่งที่ผู้ใช้ต้องการจากแอพของคุณโดยเร็วที่สุด ผู้ใช้สังเกตเห็น (และถูกรบกวน) ความล่าช้าเกินกว่า 100 มิลลิวินาทีและคุณมีลำดับความสำคัญสูงกว่าเกณฑ์นี้โดยการเพิ่มหน้าจอสแปลช
CodeFusionMobile

74
แอปจุดไฟ, aldiko (ผู้อ่าน), โลมา .. Umm the OS :) พวกเขาทุกคนมีสาด Opera Mobile, Mantan Reader, แผนที่ ฉันสามารถไปต่อ หากซ่อนโหลดอย่างน้อยก็ให้ผู้ใช้ทราบว่าแอปของคุณเริ่มทำงานแล้ว การหน่วงเวลาไม่กี่วินาทีจะถูกซ่อนไว้ที่ดีขึ้นมากเมื่อมีบางอย่างของคุณบนหน้าจอ
baash05

9
หน้าจอ Splash ให้คุณและโอกาสที่ยอดเยี่ยมในการโฆษณาเกมหรือชื่อ บริษัท หรือโลโก้แอปของคุณ ฉันชอบการทำให้หน้าจอเริ่มต้นสามารถคลิกได้เพื่อให้ผู้ใช้มีตัวเลือกในการข้ามไปข้างหน้าเกม หากผู้ใช้เห็นโลโก้ของ บริษัท ของคุณเสมอแม้กระทั่งครึ่งวินาทีทุกครั้งที่เปิดแอปของคุณพวกเขาจะมีแนวโน้มที่จะจำได้ว่าคุณเป็นใคร เพียงให้แน่ใจว่าพวกเขามีประสบการณ์ที่ดีกับแอพของคุณ
Chamatake-san

คำตอบ:


509

อ่านเพิ่มเติม:

คำตอบเก่า:

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

นั่นคือทั้งหมด;)


3
@ user2606414 โปรดสร้างคำถามเพื่อให้คุณมีปัญหาในการวางบันทึกข้อผิดพลาดทั้งหมดของคุณ
โหวต

39
อย่าลืมเพิ่มสาดใน Manifest
Jawad Zeb

8
@ กำหนดคำถามไม่ใช่วิธีแสดงหน้าจอสแปลชขณะโหลดข้อมูล
โหวต

18
นี่ไม่ใช่วิธีแก้ปัญหาที่เหมาะสมสำหรับหน้าจอสแปลชทำให้ผู้ใช้รอเพื่อแสดงหน้าจอสาด แต่จุดประสงค์ของหน้าจอสแปลชนั้นตรงกันข้าม ควรแสดงหน้าจอสแปลชในขณะที่ผู้ใช้กำลังรอ โปรดดูวิธีการแก้ปัญหาของ @ Abdullah
efeyc

4
แทนที่จะถ่วงเวลาแอSPLASH_DISPLAY_LENGTHพ คุณควรทำสิ่งนี้แทน: bignerdranch.com/blog/splash-screens-the-right-way
miguel.martin

595

หมายเหตุวิธีแก้ไขปัญหานี้จะไม่ยอมให้ผู้ใช้รออีกต่อไป:ความล่าช้าของหน้าจอสแปลชขึ้นอยู่กับเวลาเริ่มต้นของแอปพลิเคชัน

เมื่อคุณเปิดแอพ 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


3
ดูเหมือนว่า "parent" นั้นรองรับเฉพาะใน API 14 ขึ้นไป
user1832478

103
นี่เป็นวิธีที่เหมาะสมในการทำหน้าจอสแปลช ขอบคุณ! คำตอบที่มีคะแนนโหวตมากขึ้นด้วยความล่าช้าเป็นเพียงการปฏิบัติที่ไม่ดี ไม่ควรทำให้ผู้ใช้ล่าช้าในการเห็นหน้าจอการทำงานแรก
dineth

7
ปัญหาหนึ่งที่ฉันมีกับนี้คือการที่จะแทนที่<item name="android:background"> windowBackgroundและหากไม่มีการandroid:backgroundกำหนดพื้นหลังของฉันในส่วนใด ๆ จะโปร่งใสเปิดเผยกิจกรรมที่อยู่เบื้องหลังเนื้อหาเบื้องหน้า
William Grand

4
@ Abdullah: ฉันทำตามวิธีที่คุณพูด มันใช้งานได้ดี แต่หน้าจอสแปลชปรากฏขึ้นเพียงไม่กี่มิลลิวินาทีสำหรับการเปลี่ยนกิจกรรม
nizam.sp

3
@ Abdullah ขอบคุณ! นั่นเป็นทางออกที่เป็นไปได้ แต่ฉันพบสิ่งนี้: plus.google.com/+AndroidDevelopers/posts/Z1Wwainpjhdเพื่อหลีกเลี่ยงการสร้างภาพที่แตกต่างกันสำหรับขนาดหน้าจอแต่ละขนาดมันเป็นไปได้ที่จะสร้าง XML ที่มีภาพเพื่อให้มันดู ใช้ได้กับทุกหน้าจอ
adelriosantiago

52
  • สร้างกิจกรรม: สแปลช
  • สร้างไฟล์ XML เลย์เอาต์: splash.xml
  • วางองค์ประกอบ UI ในเค้าโครง splash.xml เพื่อให้เป็นไปตามที่คุณต้องการ
  • Splash.java ของคุณอาจมีลักษณะเช่นนี้:

    public class Splash extends Activity {
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);
    
            int secondsDelayed = 1;
            new Handler().postDelayed(new Runnable() {
                    public void run() {
                            startActivity(new Intent(Splash.this, ActivityB.class));
                            finish();
                    }
            }, secondsDelayed * 1000);
        }
    }
    
  • เปลี่ยนActivityB.classเป็นกิจกรรมใดก็ได้ที่คุณต้องการเริ่มหลังจากหน้าจอเริ่มต้น

  • ตรวจสอบไฟล์รายการของคุณและควรมีลักษณะดังนี้

        <activity
            android:name=".HomeScreen"
            android:label="@string/app_name">     
        </activity>

        <activity
            android:name=".Splash"
            android:label="@string/title_activity_splash_screen">     
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>

28
นี่ไม่ใช่จุดประสงค์ของหน้าจอสแปลช สิ่งนี้ทำให้ล่าช้า 1 วินาทีเพิ่มเติม หน้าจอเริ่มต้นควรเป็นภาพในขณะที่โหลดหน้าจอแรกของแอปพลิเคชัน ลิงค์นี้อาจช่วยได้ stackoverflow.com/a/7057332/869451
efeyc

2
@efeyc: คุณ 100% ถูกต้อง .. แต่มันก็ดูดีมากเมื่อแอพเริ่มแล้ว .. คุณไม่คิดเหรอ?
McLan

1
@ Suda.nese ไม่แน่นอน ผู้ใช้ไม่ต้องการดูรูปภาพผู้ใช้ต้องการใช้แอพและไม่มีความล่าช้าที่ไม่จำเป็น
ทิม

1
@TimCastelijns มันขึ้นอยู่กับแอพที่กำลังพัฒนาและหน้าจอสแปลชนั้นมีลักษณะอย่างไร .. แน่นอนว่ามันใช้งานได้จริง แต่ใครบอกว่ามันไม่สามารถใช้งานได้ !!
McLan

6
เห็นด้วย @ Suda.nese หากความต้องการของแอพรวมหน้าจอสาดกว่าหน้าจอสแปลชนั่นคือ! แน่นอนว่ามันอาจจะไม่เป็นที่พึงปรารถนาสำหรับผู้ใช้ แต่ถ้าลูกค้าต้องการหน้าจอสแปลจากนั้นก็ให้มันแก่พวกเขา
เจมส์

29

คำตอบข้างต้นนั้นดีมาก แต่ฉันต้องการเพิ่มอย่างอื่น ฉันใหม่สำหรับ Android ฉันพบปัญหาเหล่านี้ในระหว่างการพัฒนา หวังว่านี่จะช่วยคนอย่างฉันได้

  1. หน้าจอ 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>
    
  2. หน้าจอเริ่มต้นควรแสดงเพียงครั้งเดียวในวงจรชีวิตของแอพฉันใช้ตัวแปรบูลีนเพื่อบันทึกสถานะของหน้าจอเริ่มต้นและแสดงเฉพาะในครั้งแรกเท่านั้น

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

การเข้ารหัสมีความสุข!


10
คุณสามารถเพิ่มandroid:noHistory="true"ในAndroidManifest.xmlเพื่อป้องกันไม่ให้ผู้ใช้จากการที่จะกลับไปหน้าจอโดยใช้ปุ่มย้อนกลับ
Rachel

15

คำตอบของ 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();
    }
}

นั่นเป็นวิธีที่เหมาะสมในการทำ ฉันใช้การอ้างอิงเหล่านี้เพื่อหาคำตอบ

  1. https://material.google.com/patterns/launch-screens.html
  2. https://www.bignerdranch.com/blog/splash-screens-the-right-way/ ขอขอบคุณผู้คนเหล่านี้ที่ผลักฉันไปในทิศทางที่ถูกต้อง ฉันต้องการช่วยเหลือผู้อื่นเพราะคำตอบที่ยอมรับไม่ใช่หน้าจอเริ่มต้นที่แนะนำ

1
ฉันเห็นการสอนYouTubeเกี่ยวกับเรื่องนี้ layer-listแต่ผมคิดว่าขนาดบิตแมปจะเป็นปัญหาตั้งแต่คุณไม่สามารถปรับขนาดได้โดยใช้
RoCk RoCk

14
  1. สร้าง 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();
    }
     }
  2. 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> 

13

โดยค่าเริ่มต้น 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) ที่มีความยาวหรือรู้สึกว่าต้องบอกเรื่องตลกหรืออธิบายสิ่งที่เกิดขึ้นในช่วงสัปดาห์ที่ผ่านมา เพียงแสดงรายการ! (เพียงเรียกใช้โปรแกรม)


12

เหนือคำตอบทั้งหมดเป็นสิ่งที่ดีมากจริงๆ แต่มีปัญหาการรั่วของหน่วยความจำ ปัญหานี้มักจะเป็นที่รู้จักกันในชุมชน 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;
    }
}

สำหรับข้อมูลเพิ่มเติมโปรดไปที่ลิงค์นี้


7

การหยุดบนหน้าจอ 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


4

นี่คือรหัสเต็มที่นี่

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>

ไชโย


ฉันจะเพิ่มไฟล์ xml แทนได้อย่างไรdrawable
viper

ฉันหมายความว่าคุณจะต้องสร้าง bg_splash.xml ในไดเรกทอรี drawable ตามที่อธิบายไว้ข้างต้น
awsleiman

4

ไม่ควรโหลดหน้าจอสแปลชจากไฟล์เลย์เอาต์อาจมีความล่าช้าเมื่อโหลด

วิธีที่ดีที่สุดคือการสร้างชุดรูปแบบสำหรับ 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>

4

หลังจาก 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);
    }


}

4

คุณจะไม่ใช้ไฟล์เลย์เอาต์ ให้ระบุพื้นหลังของหน้าจอสแปลชเป็นพื้นหลังของธีมของกิจกรรมแทน เมื่อต้องการทำสิ่งนี้ก่อนอื่นให้สร้าง 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 สำหรับกิจกรรมสาดของคุณในชุดรูปแบบจะมีให้ใช้งานทันที

หากคุณมีไฟล์เลย์เอาต์สำหรับกิจกรรมสาดของคุณไฟล์เลย์เอาต์นั้นจะปรากฏให้ผู้ใช้เห็นหลังจากที่แอปของคุณได้รับการเริ่มต้นอย่างสมบูรณ์ซึ่งช้าเกินไป คุณต้องการให้สแปลชแสดงผลในเวลาเพียงเล็กน้อยเท่านั้นก่อนที่แอปจะเริ่มต้น


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

2

สร้างกิจกรรมให้เรากิจกรรมที่ชื่อว่า 'A' จากนั้นสร้างไฟล์ xml ชื่อ myscreen.xml ในการตั้งค่าภาพหน้าจอสแปลเป็นพื้นหลังแล้วใช้ตัวจับเวลานับถอยหลังเพื่อนำทางจาก Activtity หนึ่งไปยังอีก หากต้องการทราบวิธีใช้ตัวจับเวลาถอยหลังดูคำตอบของฉันในคำถามนี้TimerTask ใน Android


2

ตัวอย่างหน้าจอสแปลช:

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

    }

}

2

หน้าจอเริ่มต้นเป็นวัตถุที่ใช้ไม่ได้เล็กน้อยใน 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();
    }

    ...
}

มีผู้รับผลประโยชน์สำหรับวิธีการนี้และคุณสามารถเปิดตัวกิจกรรมหลักได้โดยตรง ตัวอย่างเช่นเมื่อคุณใช้การแจ้งเตือนแบบพุชในแอปของคุณเมื่อคุณเปิดใช้แอพโดยคลิกที่การแจ้งเตือนในลักษณะนี้คุณสามารถจัดการวัตถุประสงค์การแจ้งเตือนได้ดีขึ้น
Farnad Tohidkhah

2

วิธีการอื่นทำได้โดยใช้ 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();
}

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

คุณช่วยเพิ่มคำอธิบายได้ไหม?
Robert

ใช่ ... คำอธิบายที่คุณต้องการให้ฉันรู้โปรด
Ashish Kumar

2

ง่ายมาก & วิธี gr8:

  • ขั้นแรกสร้างสแปลชของคุณด้วยเว็บไซต์ต่อไปนี้:

    https://www.norio.be/android-feature-graphic-generator/

    เลือกโลโก้และสโลแกนของคุณเลือกพื้นหลังที่สวยงามของคุณ ปรับขนาดเป็น 4096x4096

  • ตอนนี้ดาวน์โหลดรูปภาพนั้นและอัปเดตเป็น:

    https://apetools.webprofusion.com/app/#/tools/imagegorilla

    และสร้างหน้าจอสแปลชทั้งหมดที่จำเป็นอุปกรณ์ทั้งหมดแพลตฟอร์มทั้งหมด

สนุก!

มีคำตอบที่เพียงพอที่จะช่วยในการดำเนินการ โพสต์นี้มีไว้เพื่อช่วยเหลือผู้อื่นในขั้นตอนแรกของการสร้างหน้าจอเริ่มต้น!


1

วิธีการเกี่ยวกับหน้าจอเรียกใช้งานที่ยืดหยุ่นเป็นพิเศษซึ่งสามารถใช้รหัสเดียวกันและกำหนดไว้ใน 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();
    }
  }
}

1

ผู้ใช้บางครั้งเปิดSplashActivityและเลิกทันที แต่ app ยังคงไปหลังจากMainActivitySPLASH_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);
        }                             
   }                                
}

หวังว่าความช่วยเหลือนี้


1

แม้ว่าจะมีคำตอบที่ดี แต่ฉันจะแสดงวิธีที่แนะนำโดย 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โฟลเดอร์ถ้าภาพของคุณไม่เล็ก

มันจะส่งผลให้หน้าจอเรียกใช้เริ่มต้นเร็วขึ้นและช่วยให้คุณประหยัดจากหน้าจอสีดำ

นอกจากนี้ยังหลีกเลี่ยงการเบิกเกินบัญชีเป็นพิเศษ


1

นี่คือโพสต์ที่ดีที่สุดที่ฉันเคยเห็นบนหน้าจอสแปลช: http://saulmm.github.io/avoding-android-cold-starts

Saúl Molinero มีสองตัวเลือกที่แตกต่างกันสำหรับหน้าจอเริ่มต้น: ใช้ประโยชน์จากพื้นหลังหน้าต่างเพื่อทำให้เคลื่อนไหวในหน้าจอเริ่มต้นของคุณและแสดง UI ตัวยึด (ซึ่งเป็นตัวเลือกยอดนิยมที่ Google ใช้กับแอพส่วนใหญ่ในปัจจุบัน)

ฉันอ้างถึงโพสต์นี้ทุกครั้งที่ฉันต้องพิจารณาเวลาเริ่มเย็นและหลีกเลี่ยงการออกจากผู้ใช้เนื่องจากเวลาเริ่มต้นนาน

หวังว่านี่จะช่วยได้!


1

ในกรณีของฉันฉันไม่ต้องการสร้างกิจกรรมใหม่เพียงเพื่อแสดงภาพเป็นเวลา 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ง่ายเรียบง่ายมีประสิทธิภาพ


1

มันง่ายมากใน 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);
    }

1

คุณสามารถเพิ่มสิ่งนี้ในวิธีการสร้างของคุณ

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;

สำหรับรายละเอียดเพิ่มเติมดาวน์โหลดรหัสเต็มจากลิงค์นี้ ...

https://github.com/Mr-Perfectt/Splash-Screen


1

ใน Kotlin เขียนรหัสนี้: -

 Handler().postDelayed({
            val mainIntent = Intent(this@SplashActivity, LoginActivity::class.java)
            startActivity(mainIntent)
            finish()
        }, 500)

หวังว่านี่จะช่วยคุณได้ขอบคุณ ........


0

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

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

นี่เป็นตัวอย่างที่ไม่ดี - จะเกิดอะไรขึ้นถ้าคุณออกจาก SplashActivity โดยกดกลับ ด้ายจะยังคงดำเนินการ
Mark Keen
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.