0

このアプリは、最初の画面にスレッドが含まれていることを書きました。それで、私はそれを7秒のように計りました。それから次の活動に進みます.

問題は、ホームボタンを押すたびに音楽が停止し、Android のホーム画面に移動しますが、7 秒の時間が経過すると、アプリが再び表示され、次のアクティビティが表示されます。

を入れてみfinish();ましたonpause();が、まだ次のアクティビティが表示されています。

これが実際のコードです。

public class HelloWorldActivity extends Activity {
    MediaPlayer mp;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.splash);
        mp = MediaPlayer.create(this, R.raw.otj);
        mp.start();

        Thread LogoTimer = new Thread(){
            public void run(){
                try{
                    int LogoTimer = 0;
                while(LogoTimer < 7000){
                    sleep(100);
                    LogoTimer = LogoTimer + 100;


                    }


                startActivity(new Intent("com.example.HelloWorld.CLEARSCREEN"));
                } catch (InterruptedException e) {

                    e.printStackTrace();
                }

                    finally{
                    finish();
                    }

            }
        };
        LogoTimer.start();

    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        mp.release();



    }

    @Override
    protected void onPause() {
        // TODO Auto-generated method stub
        super.onPause();
        mp.pause();
    }

    @Override
    protected void onResume() {
        // TODO Auto-generated method stub
        super.onResume();
    }

    @Override
    protected void onStop() {
        // TODO Auto-generated method stub
        super.onStop();
    }
}
4

2 に答える 2

2

アプリケーションはまだバックグラウンドにあり、スレッドは破棄されていないため、startActivity が起動されます。

なんらかの理由で UI から外したくない場合を除き、この方法でスプラッシュ スクリーンをセットアップしたり、スレッドを使用したりすることはありません。それでも、より良いオプションがあります。

教育目的でこれを処理するには、onPause() でスレッドを安全に中止できる必要があります。その方法の 1 つを以下に示します。

修正されたスレッド

    Thread LogoTimer = new Thread() {

    private volatile boolean abortThread = false;

       public void run(){

       long stopAt = System.currentTimeMillis() + 7000;

       while (!abortThread && stopAt > System.currentTimeMillis())
          yield();

       if (!abortThread)
           startActivity ... 
     }

    public synchronized void stopThread() {
        abortThread = true;
    }
};
于 2011-07-28T21:42:11.900 に答える
2

まず、これはタイマーを実行する非常に非効率的な方法です。代わりにこの方法を試してください:

new Handler().postDelayed(new Runnable() {

    public void run() {
        // Do some work.
    }

}, delayTimeInMs);

第二に、そのタイマーが最終的に起動したときに新しいアクティビティを開始します。発信活動が終了しても構いません。startActivity() は独自のスレッドで実行されており、関係なく実行されます。

postDelayed() メソッドが期待どおりに機能する可能性があります。そうでない場合は、実際にアクティビティを開始する必要があるかどうかを実行時に確認する必要があります。ただし、ハンドラーはデフォルトのルーパーにアタッチされていると思います。つまり、メインのアクティビティが終了すると停止します (というか、メッセージは投稿されません)。

于 2011-07-28T21:23:47.367 に答える