如何在呈现 SplashScreen 期间 运行 MainActivity

How to run MainActivity during presenting SplashScreen

我可以找到两种实现方法 splash screen

public class MainSplashScreen extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main_splash_screen);

// METHOD 1     

         /****** Create Thread that will sleep for 5 seconds *************/        
        Thread background = new Thread() {
            public void run() {

                try {
                    // Thread will sleep for 5 seconds
                    sleep(5*1000);

                    // After 5 seconds redirect to another intent
                    Intent i=new Intent(getBaseContext(),MainActivity.class);
                    startActivity(i);

                    //Remove activity
                    finish();

                } catch (Exception e) {

                }
            }
        };

        // start thread
        background.start();

//METHOD 2  

        /*
        new Handler().postDelayed(new Runnable() {

            // Using handler with postDelayed called runnable run method

            @Override
            public void run() {
                Intent i = new Intent(MainSplashScreen.this, MainActivity.class);
                startActivity(i);

                // close this activity
                finish();
            }
        }, 5*1000); // wait for 5 seconds
        */
    }

    @Override
    protected void onDestroy() {

        super.onDestroy();

    }
}

正如预期的那样,这两种方法都首先显示启动画面 5 秒,然后启动 MainActivity。

在我的App中,MainActivity启动起来比较耗时。因此,我在这两种方法中看到的是闪屏 5 秒,然后黑屏几秒钟(就像我不使用闪屏时一样),然后是 MainActivity。

问题是如何在启动画面显示期间启动 MainActivity。

我尝试同时定义两个线程和 运行,但结果与我不使用闪屏时完全一样。

        Thread background = new Thread() {
            public void run() {
                try {
                    sleep(5*1000);
                    finish();
                } catch (Exception e) {}
            }
        };
        Thread mainTh = new Thread() {
            public void run() {
                try {
                    Intent i=new Intent(getBaseContext(),MainActivity.class);
                    startActivity(i);
                } catch (Exception e) {}
            }
        };
        mainTh.start();
        background.start();

试试这个,

public class Splash extends Activity {

    private static final int SPLASH_SHOW_TIME = 1000;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
//      Fabric.with(this, new Crashlytics());
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_splash);

        new BackgroundSplashTask().execute();

    }

    private class BackgroundSplashTask extends AsyncTask<Void, Void, Void> {

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
        }

        @Override
        protected Void doInBackground(Void... arg0) {
            try {
                Thread.sleep(SPLASH_SHOW_TIME);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            super.onPostExecute(result);
            Intent i = new Intent(Splash.this, MainActivity.class);
            startActivity(i);
            finish();
        }

    }
}

使用 Ian Lake 的最佳实践 - [​​=10=]。这会在您的 activity 加载所有组件时为您提供品牌屏幕。

如果您想冻结您的应用程序 5 秒 - 这不是最好的主意,但您可以这样做。只需将 post 延迟消息发送给处理程序。在处理程序中,您将捕获消息并使用 setContent 等初始化您的 activity...

您可以使用以下代码进行切换。

Handler mHandler = new Handler();
            mHandler.postDelayed(new Runnable() {

                @Override
                public void run() {
                    startActivity(new Intent(SplashActivity.this,MainActivity.class));
                    finish();
                }

            }, 2000);