Android启动画面无法显示

时间:2014-08-03 12:55:51

标签: android android-activity splash-screen

我试图在主要活动的布局显示之前显示启动画面。 我是这样做的(PuzzleActivity是我的主要活动):

public class PuzzleActivity extends Activity{
...
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.splash);
    ...
    ... (Do some background work)
    ...
    Thread.sleep(20000); // Sleep for 20 seconds
    setContentView(R.layout.activity_main);
}
}

我希望我的启动画面显示至少20秒。

尽管如此,它根本没有表现出来。相反,我看到黑屏20秒,然后我的主要活动屏幕......

当我尝试删除最后一个setContentView()时,我看到了我的启动画面。

有人可以告诉我为什么在使用上面的代码时看不到我的启动画面?

5 个答案:

答案 0 :(得分:1)

Thread.sleep(time)导致发送此消息的线程在给定的时间间隔内休眠。

从UI线程调用Thread.sleep(20000);将使其休眠20秒,使您的活动无响应,这通常是一个坏主意。

我亲自为启动画面构建一个专用的启动器活动,一旦经过了所需的时间,我就会导航到主要活动,在您的情况下,它将如下所示:

   public class SplashActivity extends Activity {

        // Splash screen time in milliseconds
        private static final long LOADING_TIME = 2000;

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

            Thread timer = new Thread() {
                public void run() {
                    try {
                        sleep(LOADING_TIME);
                    } catch (InterruptedException ie) {
                        ie.printStackTrace();
                    } finally {
                        Intent openMainActivity = new Intent(SplashActivity.this, PuzzleActivity.class);
                        startActivity(openMainActivity );
                        SplashActivity.this.finish();
                    }
                }
            };

            timer.start();          
        }   
    }

答案 1 :(得分:0)

您必须先setContentView,然后像这样运行Thread

setContentView(R.layout.activity_splash_screen);

    Thread background = new Thread() {
        public void run() {

            try {
                sleep(1*1000);

                Intent i=new Intent(SplashScreen.this, MainActivity.class);
                startActivity(i);

                //Remove activity
                finish();

            } catch (Exception e) {

            }
        }
    };

    // start thread
    background.start();

答案 2 :(得分:0)

在Android上,应尽可能避免使用启动画面。因此,不显示它将解决您的问题,并使您的应用程序遵循指南。除非你有一些沉重的负荷。

  

如果您的应用程序有一个耗时的初始设置阶段,请考虑尽快显示启动画面或渲染主视图,指示正在进行加载并异步填充信息。在任何一种情况下,您都应该以某种方式表明正在取得进展,以免用户认为应用程序被冻结。 (source

一些值得阅读的链接(无论是您还是您的客户):

(是的,最终,客户做出决定,但是一点教育永远无用)

答案 3 :(得分:0)

我做的是这个:

清单:

<activity
        android:name="com.antonis.android.eventz.MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="portrait" >
        <intent-filter>
            <action android:name="splashImage" />

            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    <activity
        android:name="com.antonis.android.eventz.SplashActivity"
        android:label="@string/title_activity_splash"
        android:screenOrientation="portrait"
        android:theme="@android:style/Theme.NoTitleBar" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

然后在我的启动类中:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_splash);

    Thread splashTread = new Thread() {

        @SuppressWarnings("deprecation")
        @Override
        public void run() {

            try {
                sleep(1000);
            } catch (InterruptedException e) {
                // do nothing
            } finally {
                SplashActivity.this.finish();
                startActivity(new Intent("splashImage"));
            }
        }
    };
    splashTread.start();
}

答案 4 :(得分:0)

我发现在Activity的onCreate()方法结束之前屏幕是空的。 因此,我唯一要做的就是将处理工作移出onCreate()方法(使用处理程序)。 然后,我可以轻松切换内容视图。