Android加载时显示Splash-Screen

时间:2015-07-17 10:18:03

标签: java android splash

我有一个Android应用程序,它显示了一个" Splash Screen"持续3秒之后,MainActivity被加载。

不幸的是,MainActivity需要额外的~4秒才能加载。在第一次启动时甚至更长。但是,当加载App时,一切都顺利进行。

现在,如何在启动画面显示期间实现MainActivity的加载?它应该显示一个图像,直到整个东西完全加载。 我已经阅读了有关Async-Task的内容,但我不确定将它放在何处以及如何正确使用它。有人能帮帮我吗?

SplashScreen.java

public class SplashScreen extends Activity {
    private static int SPLASH_TIME_OUT = 3000;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_startup);

        new Handler().postDelayed(new Runnable() {
            @Override
            public void run() {
                Intent i = new Intent(SplashScreen.this, MainActivity.class);
                startActivity(i);
                finish();
            }
        }, SPLASH_TIME_OUT);
    }
}

MainActivity.java

public class MainActivity extends Activity implements OnClickListener, MediaController.MediaPlayerControl {

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

        //Some heavy processing
        //starting services
        //starting Google Text to Speech
        //and so on...

    }

}

5 个答案:

答案 0 :(得分:30)

您不应该在启动时创建新线程,而是应该创建一个不必等待资源加载的视图,如本文所述:setProvider(java.lang.String providerName)

如文章所述,您应该创建一个layer-list drawable而不是layout XML文件:

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

然后使用drawable文件作为背景创建主题。我使用background属性而不是文章中建议的windowBackground属性,因为background考虑了状态和导航栏,使绘图更加居中。我还将windowAnimationStyle设置为null,以便启动画面不会动态转换为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>

然后在您的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>

最后,您只需要在SplashActivity中启动MainActivity,启动屏幕只会显示您的应用配置所需的时间:

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 :(得分:13)

如果对显示启动画面的时间没有特定限制,您可以通过以下方式使用AsyncTask

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

如果结果数据的性质不是String,则可以将Parcelable对象作为额外的活动。在onCreate中,您可以使用以下内容检索数据:

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

答案 2 :(得分:0)

你的启动画面代码工作正常,但是当你调用下一个活动时,然后在onCreate()中使用Asynctask来完成繁重的任务......

答案 3 :(得分:0)

为简单起见,您将泼水活动与主要活动结合起来怎么样?这样你就可以获得两全其美的效果,即数据第一次准备时的启动画面,以及之前准备好的快速启动。让用户等待什么都不是真正好的形式...

类似的东西:

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
    }

}

答案 4 :(得分:0)

只要喜欢这篇文章:https://www.bignerdranch.com/blog/splash-screens-the-right-way/

1-为初始屏幕创建这样的XML布局。我称它为“ 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-然后,转到styles.xml并编写如下样式:

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

3-将活动写入启动画面。我称它为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-最后,转到您的AndroidManifest.xml并添加您的活动闪屏:(注意:不要在AndroidManifest中删除任何内容,只需在活动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>

完成。您无需担心应用程序将需要启动的时间,启动将在这里停留足够的时间。准备好MainActivity后,将显示它。