Splashscreen - 第一次使用共享首选项

时间:2012-06-14 22:38:17

标签: android splash-screen

你好我想在默认情况下显示另一个启动画面,如果应用程序第一次启动(例如,在安装之后)。

所以我写了这个。但是新的Activity没有启动它停留在Splash屏幕上。有人会说它有什么不对吗?

import android.app.Activity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.widget.TextView;

    public class splash extends Activity {
         private Thread splashTread;

        @Override
        protected void onCreate(Bundle savedInstanceState) {
            // TODO Auto-generated method stub
            super.onCreate(savedInstanceState);
            setContentView(R.layout.splash);

            SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
            if(!prefs.getBoolean("firstTime", false)) {
                // run your one time code
                 Intent i = new Intent(splash.this, main.class);

                         startActivity(i);
                SharedPreferences.Editor editor = prefs.edit();
                editor.putBoolean("firstTime", true);
                editor.commit();


             // thread for displaying the SplashScreen
             splashTread = new Thread() {
                 @Override
                 public void run() {
                     try {
                         synchronized(this){

                                 //wait 2 sec
                                 wait(2000);
                         }

                     } catch(InterruptedException e) {}
                     finally {
                         finish();



                         //start a new activity
                         Intent i = new Intent();
                         i.setClass(splash.this, main.class);
                                 startActivity(i);

                         stop();
                     }
                 }
             };

             splashTread.start();

        }

    }
    }

感谢。

4 个答案:

答案 0 :(得分:6)

从我所看到的,无论启动是否是第一次,您的代码都运行相同的Activity(main)。我假设您的目的是在第一次启动时立即启动备用启动屏幕,否则在2秒后继续执行主活动。此外,我建议使用Handler而不是Thread,因为你只使用它一次,并且延迟使用。试试这个:

    public class splash extends Activity
{
    private Handler handler = new Handler()
    {
        public void handleMessage(Message msg)
        {
            Intent i = new Intent(splash.this, main.class);
            splash.this.startActivity(i);
                                 this.finish()
        }
    };

    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);

        SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);
        if(!prefs.getBoolean("first_time", false))
        {
            SharedPreferences.Editor editor = prefs.edit();
            editor.putBoolean("first_time", true);
            editor.commit();
            Intent i = new Intent(splash.this, otherSplash.class);
            this.startActivity(i);
                                 this.finish();
        }
        else
        {
            this.setContentView(R.layout.splash);
            handler.sendEmptyMessageDelayed(0, 2000);
        }

    }
}

答案 1 :(得分:1)

而不是调用finish() ...只需使用FLAG_ACTIVITY_CLEAR_TOP

启动主要活动

http://developer.android.com/reference/android/content/Intent.html#FLAG_ACTIVITY_CLEAR_TOP

以下是有关该FLAG的更多信息

FLAG_ACTIVITY_CLEAR_TOP in Android

为了更清楚,我建议的是你要么

  1. 使Splash成为默认活动,并在超时后调用Main活动,或者,如果已经看到启动(首选项检查)。 (即,所有启动逻辑都在Splash活动中)
  2. 进行Main活动检查以查看是否应调用Splash(首选项检查),如果是,请使用相同的CLEAR_TOP标志启动它,然后使用Splash超时并在几秒钟后使用Main再次设置CLEAR_TOP。 (这混合了SplashMain
  3. 中的启动逻辑

    最终结果是,Main完成后,Splash将成为堆栈中唯一的活动。

答案 2 :(得分:0)

如果您的目的是简单地拥有多个“Splash”屏幕,并且它们没有逻辑,除了仅显示内容之外,为什么不使用单个活动并将视图替换为第二次启动的新视图。您还必须在UI线程上执行此更新,因此您需要使用an Handler或使用AsyncTask,或使用已知视图中的View.post()当前视图中的元素。

答案 3 :(得分:-1)

我认为你不能/应该从不是UI线程的线程启动活动。更改为AsyncTask,或使用处理程序