Android display Splash-Screen while loading

前端 未结 6 476
忘掉有多难
忘掉有多难 2020-12-02 17:38

I have an Android App, which shows a \"Splash Screen\" for 3 seconds. After that, the MainActivity gets loaded.

Unfortunately the MainActivity takes additional ~4 se

相关标签:
6条回答
  • 2020-12-02 18:13

    How about, in the interest of simplicity, you combine your splash activity with your main activity? That way you get the best of both worlds, namely a splash screen while your data is preparing the first time, and a quick startup when it's been prepared previously. Making the user wait for nothing is not really good form...

    Something like:

    public class MainActivity extends Activity implements OnClickListener, MediaController.MediaPlayerControl {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            // Initially shows splash screen, the main UI is not visible
            setContentView(R.layout.activity_main);  
    
            // Start an async task to prepare the data. When it finishes, in
            // onPostExecute() get it to call back dataReady()
            new PrepareDataAsyncTask(this).execute();
    
        }
    
        public void dataReady() {
            // Hide splash screen
            // Show real UI
        }
    
    }
    
    0 讨论(0)
  • 2020-12-02 18:14

    your splash screen code works fine but when you call next activity then in onCreate() use Asynctask for your heavy tasks...

    0 讨论(0)
  • 2020-12-02 18:17

    Just do like in this article: https://www.bignerdranch.com/blog/splash-screens-the-right-way/

    1 - create a XML layout like this for the splash screen. I called it "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/cardview_light_background"/>
    
        <item>
            <bitmap
                android:gravity="center"
                android:src="@drawable/kiss_com_sub_logo"/>
        </item>
    
    </layer-list>
    

    2 - Then, go to the styles.xml and write a style like this:

    <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
            <item name="android:windowBackground">@drawable/background_splash</item>
    </style>
    

    3 - Write an activity to your splash. I called it SplashActivity.kt

    package com.example.kissmoney
    
    import android.content.Intent
    import android.os.Bundle
    import androidx.appcompat.app.AppCompatActivity
    
    
    class SplashActivity : AppCompatActivity() {
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val intent = Intent(this, MainActivity::class.java)
            startActivity(intent)
            finish()
        }
    }
    

    4 - Finally, go to you AndroidManifest.xml and add you activity splash: (Note: don't remove nothing in the AndroidManifest, just add this befora the activity Main).

    <activity
           android:name=".SplashActivity"
           android:label="Kiss"
           android:theme="@style/SplashTheme">
           <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
           </intent-filter>
    </activity>
    

    This is done. You don't need to worry about the time that your application will demand to start, the splash will be there just for enough time. When you MainActivity is ready, it will be showed.

    0 讨论(0)
  • 2020-12-02 18:20

    If there are no specific constraints about the time the splash screen should be shown, you could use the AsyncTask in the following way:

    public class SplashScreen extends Activity {
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_startup);
            startHeavyProcessing();
    
        }
    
        private void startHeavyProcessing(){
           new LongOperation().execute("");
        }
    
        private class LongOperation extends AsyncTask<String, Void, String> {
    
            @Override
            protected String doInBackground(String... params) {
                //some heavy processing resulting in a Data String
                for (int i = 0; i < 5; i++) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        Thread.interrupted();
                    }
                }
                return "whatever result you have";
            }
    
            @Override
            protected void onPostExecute(String result) {
                Intent i = new Intent(SplashScreen.this, MainActivity.class);
                i.putExtra("data", result);
                startActivity(i);
                finish();
            }
    
            @Override
            protected void onPreExecute() {}
    
            @Override
            protected void onProgressUpdate(Void... values) {}
        }
    }
    

    If the resulting data if of another nature than a String you could put a Parcelable Object as an extra to your activity. In onCreate you can retrieve the data with:

    getIntent().getExtras.getString('data');

    0 讨论(0)
  • 2020-12-02 18:23

    You should not be creating a new thread on startup, instead you should create a view that does not have to wait for your resources to load, as detailed in this article: Splash Screens the Right Way.

    As stated in the article, you should create a layer-list drawable instead of a layout XML file:

    <layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    
        <!-- Fill the background with a solid color -->
        <item android:drawable="@color/gray"/>
    
        <!-- Place your bitmap in the center -->
        <item>
            <bitmap
                android:gravity="center"
                android:src="@mipmap/ic_launcher"/>
        </item>
    
    </layer-list>
    

    Then create a theme using the drawable file as a background. I use the background attribute instead of the windowBackground attribute as suggested in the article, because background takes the status and navigation bars into account, centering the drawable better. I also set windowAnimationStyle to null so that the splash screen does not animate the transition to the MainActivity:

    <resources>
    
        <!-- Base application theme -->
        <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
            <!-- Customize your theme here. -->
        </style>
    
        <!-- Splash Screen theme -->
        <style name="SplashTheme" parent="Theme.AppCompat.NoActionBar">
            <item name="android:background">@drawable/background_splash</item>
            <item name="android:windowAnimationStyle">@null</item>
        </style>
    
    </resources>
    

    Then declare your theme in the manifest for your SplashActivity:

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

    And finally all you have to do in your SplashActivity is start your MainActivity, and the splash screen will only show for as long as it takes for your app to configure:

    public class SplashActivity extends AppCompatActivity {
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
    
            Intent intent = new Intent(this, MainActivity.class);
            startActivity(intent);
            finish();
        }
    }
    
    0 讨论(0)
  • 2020-12-02 18:29

    I have had similar problem. There was a blank loading screen (not even toolbar). Mu culprit was in the manifest in the MainActivity:

     android:launchMode="singleInstance"
    
    0 讨论(0)
提交回复
热议问题