2

こんにちは、アプリが初めて起動した場合(インストール直後など)、デフォルトのスプラッシュ画面の後に別のスプラッシュ画面を表示したいと思います

だから私はこれを書きました。ただし、新しいアクティビティは開始されず、スプラッシュ画面のままになります。誰かがそれの何が悪いのか言うことができますか?

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

私が見たところ、起動が初めてかどうかに関係なく、コードは同じアクティビティ(メイン)を実行します。初めての起動の場合はすぐに代替スプラッシュ画面を起動することが目的であると想定しています。それ以外の場合は、2秒後にメインアクティビティに進みます。また、スレッドではなくハンドラーを使用することをお勧めします。これは、ハンドラーを1回だけ使用し、遅延が発生するためです。これを試して:

    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

そのFLAGの詳細は次のとおりです

AndroidのFLAG_ACTIVITY_CLEAR_TOP

明確にするために、私が提案しているのは、あなたがどちらかであるということです

  1. デフォルトSplashのアクティビティを作成し、タイムアウト後にアクティビティを呼び出しますMain。または、スプラッシュがすでに表示されている場合は、アクティビティを呼び出します(設定チェック)。(つまり、すべてのスプラッシュロジックがSplashアクティビティに含まれています)
  2. Mainアクティビティチェックを実行して、呼び出す必要があるかどうかを確認し(Splash設定チェック)、呼び出す必要がある場合は、同じCLEAR_TOPフラグを使用して開始し、Splashタイムアウトを設定して、数秒後にMain再度設定します。(これにより、とのCLEAR_TOP両方でスプラッシュロジックが混在します)SplashMain

最終結果は、完了Mainすると、スタック上の唯一のアクティビティになりますSplash

于 2012-06-15T00:52:03.637 に答える
0

単に複数の「スプラッシュ」画面を作成することを意図していて、コンテンツを表示する以外にロジックがない場合は、1つのアクティビティを使用して、2番目のスプラッシュ用にビューを新しいビューに置き換えてください。UIスレッドでもこの更新を行う必要があるため、anHandlerまたはuse andAsyncTaskを使用するかView.post()、現在のビューの既知のビュー要素から使用する必要があります。

于 2012-06-15T13:10:30.277 に答える
-1

UIスレッドではないスレッドからアクティビティを開始できる/すべきではないと思います。AsyncTaskに変更するか、ハンドラーを使用します

于 2012-06-15T06:04:53.937 に答える