Best way to have a splash screen in an Android application?

后端 未结 6 1267
别跟我提以往
别跟我提以往 2020-12-17 00:40

I need a splash screen for my application. Tried creating an activity having the image for my splash screen; and tried using for loop and the Timer class for introducing a t

相关标签:
6条回答
  • 2020-12-17 01:14

    Try this,

    protected int _splashTime = 15000; 
    
    private Handler handler;
    private Runnable runnable; 
    
    private Context context;
    
    
    @Override
    public void onCreate(Bundle savedInstance)
    {
        super.onCreate(savedInstance);
        setContentView(R.layout.splash);   
    
        final SplashScreen sPlashScreen = this; 
    
        handler = new Handler();
    
         runnable = new Runnable() {
             @Override
                public void run() { 
                 try {
                    handler.removeCallbacks(runnable);
                    handler.postDelayed(runnable, _splashTime);
                  }  
                finally {
                    finish(); 
                    //start a new activity
    
                    //mtdCheckLicense();
                    Intent main = new Intent();
                    main.setClass(sPlashScreen, YourMainActivity.class);
                    startActivity(main); 
                    handler.removeCallbacks(runnable);
    
                }
            }
        }; 
        handler.postDelayed(runnable, 2000);
    } 
    

    It will splash for some time and launch the main activity. In this code the splash screen wait for 2Seconds and then launches the main activity.

    0 讨论(0)
  • 2020-12-17 01:22

    With the solutions described here you're wasting time because they pause the initialization for 2-3seconds before they continue.

    I prefer adding a Splash Screen Layout on top of my main_activity.xml. I detect the first start of the application by extending Application. If it´s the first start, I show my Splash-Screen while the UI is build in the background... (Use background threads if the ProgressBar lags!)

    //Extend Application to save the value. You could also use getter/setter for this instead of Shared Preferences...
    public class YourApplication extends Application {
    
        public static final String YOUR_APP_STARTUP = "APP_FIRST_START";
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            //set SharedPreference value to true
            SharedPreferences mPreferences = PreferenceManager.getDefaultSharedPreferences(getApplicationContext());
            SharedPreferences.Editor editor = mPreferences.edit();
            editor.putBoolean(YOUR_APP_STARTUP, true);
            editor.apply();     
            ...    
         }
    

    Check for your first start in your MainActivity

    public class YourMainActivity extends Activity {
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        //hide actionbar and other menu which could overlay the splash screen
        getActionBar().hide();
    
        setContentView(R.layout.activity_main);
    
        Boolean firstStart = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()).getBoolean(TVApplication.YOUR_APP_STARTUP, true);
    
        if (firstStart) {
            //First app start, show splash screen an hide it after 5000ms
            final RelativeLayout mSplashScreen = (RelativeLayout) findViewById(R.id.splash_screen);
            mSplashScreen.setVisibility(View.VISIBLE);
            mSplashScreen.setAlpha(1.0f);
            final FrameLayout mFrame = (FrameLayout) findViewById(R.id.frame_container);
            mFrame.setAlpha(0.0f);
    
            Handler handler = new Handler();
            handler.postDelayed(new Runnable() {
                @Override
                public void run() {
                    Animation fadeOutAnimation = AnimationUtils.loadAnimation(getApplicationContext(),
                            R.anim.fade_out_animation);
                    fadeOutAnimation.setDuration(500);
                    fadeOutAnimation.setAnimationListener(new Animation.AnimationListener() {
    
                        @Override
                        public void onAnimationStart(Animation animation) {
                            mFrame.setAlpha(1.0f);
                            getActionBar().show();
                        }
    
                        @Override
                        public void onAnimationEnd(Animation animation) {
                            mSplashScreen.setVisibility(View.GONE);
                        }
    
                        @Override
                        public void onAnimationRepeat(Animation animation) {
    
                        }
                    });
                    mSplashScreen.startAnimation(fadeOutAnimation);
                }
            }, 5000); //<-- time of Splash Screen shown
    
        } else {
            ((RelativeLayout) findViewById(R.id.splash_screen)).setVisibility(View.GONE);
            getActionBar().show();
        }
    

    Insert the SplashScreen at top in your main.xml. I prefer RelativeLayout for that. In the example, SplashScreen is placed on to of a layout with the Navitgation Drawer, which we really love, don`t we?

    //main_activity.xml
    <?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="match_parent" >
    
        <android.support.v4.widget.DrawerLayout
            android:id="@+id/drawer_layout"
            android:layout_width="match_parent"
            android:layout_height="match_parent" >
    
            <!-- The main content view -->
    
            <FrameLayout
                android:id="@+id/frame_container"
                android:layout_width="match_parent"
                android:layout_height="match_parent" />
    
            <!-- The navigation drawer list -->
    
            <ListView
                android:id="@+id/slider_list"
                android:layout_width="240dp"
                android:layout_height="match_parent"
                android:layout_alignParentTop="true"
                android:layout_gravity="start"
                android:background="@color/tvtv_background"
                android:choiceMode="singleChoice"
                android:divider="@drawable/nav_bar_divider"
                android:dividerHeight="1dp"
                android:listSelector="@android:color/transparent" />
        </android.support.v4.widget.DrawerLayout>
    
        <RelativeLayout
            android:id="@+id/splash_screen"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:layout_alignParentTop="true"
            android:background="@color/tvtv_white"
            android:visibility="visible" >
    
            <ImageView
                android:id="@+id/splash_screen_logo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:paddingLeft="50dp"
                android:paddingRight="50dp"
                android:scaleType="fitCenter"
                android:src="@drawable/ic_launcher" />
    
            <TextView
                android:id="@+id/splash_screen_text"
                style="@style/TVTextBlueContent"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/splash_screen_logo"
                android:layout_centerHorizontal="true"
                android:padding="10dp"
                android:text="Awesome splash shiat" />
    
            <ProgressBar
                android:id="@+id/splash_screen_loader"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_below="@+id/splash_screen_text"
                android:layout_centerHorizontal="true"
                android:clickable="false"
                android:indeterminate="true" />
        </RelativeLayout>
    
    </RelativeLayout>   
    
    0 讨论(0)
  • 2020-12-17 01:28

    The above solutions are good, but what if the user presses the back-key (and closes your app) before the splash-delay is over. The app will probably still open the next Activity, which isn't really user-friendly.

    That's why I work with a custom Handler, and remove any pending messages in onDestroy().

    public class SplashActivity extends Activity
    {
        private final static int MSG_CONTINUE = 1234;
        private final static long DELAY = 2000;
    
        @Override
        protected void onCreate(Bundle args)
        {
            super.onCreate(args);
            setContentView(R.layout.activity_splash);
    
            mHandler.sendEmptyMessageDelayed(MSG_CONTINUE, DELAY);
        }
    
        @Override
        protected void onDestroy()
        {
            mHandler.removeMessages( MSG_CONTINUE );    
            super.onDestroy();
        }
    
        private void _continue()
        {
            startActivity(new Intent(this, SomeOtherActivity.class));
            finish();
        }
    
        private final Handler mHandler = new Handler()
        {
            public void handleMessage(android.os.Message msg)
            {
                switch(msg.what){
                    case MSG_CONTINUE:
                        _continue();
                        break;
                }
            }
        };
    }
    
    0 讨论(0)
  • 2020-12-17 01:30

    The simplest way I do for my every project is looks like this:

    public class SplashActivity extends Activity {
        protected boolean active = true;
        protected int splashTime = 1000;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash_screen);
            Thread splashTread = new Thread() {
                @Override
                public void run() {
                    try {
                        int waited = 0;
                        while(active && (waited < splashTime)) {
                            sleep(100);
                            if(active) {
                                waited += 100;
                            }
                        }
                    } catch(InterruptedException e) {
                        // do nothing
                    } finally {
                        finish();
                        // Start your Activity here
                   }
               }
           };
           splashTread.start();    
       }
     //...
    
    0 讨论(0)
  • 2020-12-17 01:31

    Try this

    public class SplashActivity extends Activity {
        Handler handler;
        private long timeDelay = 2000; //2 seconds
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.SplashLayout);
            final Intent i = new Intent(this, Landing.class);
            handler = new Handler(); 
            handler.postDelayed(new Runnable() { 
                 public void run() { 
                     startActivity(i); 
                     finish();
                 } 
            }, timeDelay); 
        }      
    }
    
    0 讨论(0)
  • 2020-12-17 01:31

    You could just delay?

    Thread delay = new Thread() {
        @Override
        public void run() {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
            }
    
            runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    startNextActivity();
                }
            });
        }
    };
    
    0 讨论(0)
提交回复
热议问题