2

您好,如果应用程序第一次启动(例如在安装后),我想在默认屏幕之后显示另一个启动屏幕

所以我写了这个。但是新的 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

4 回答 4

6

从我所见,无论启动是否是第一次,您的代码都会运行相同的 Activity (main)。我假设您的目的是在第一次启动时立即启动备用启动屏幕,否则在 2 秒后继续进入主 Activity。另外,我建议使用 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);
        }

    }
}
于 2012-06-15T07:52:42.883 回答
1

而不是调用finish()......只需开始主要活动FLAG_ACTIVITY_CLEAR_TOP

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

这是有关该标志的更多信息

Android 中的 FLAG_ACTIVITY_CLEAR_TOP

更清楚地说,我的建议是你要么

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

最终结果是Main,一旦完成,这将是堆栈上的唯一活动Splash

于 2012-06-15T00:52:03.637 回答
0

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

于 2012-06-15T13:10:30.277 回答
-1

我认为您不能/不应该从不是 UI 线程的线程开始活动。更改为 AsyncTask,或使用 Handler

于 2012-06-15T06:04:53.937 回答