即使按下主页按钮或后退按钮,Android应用程序也会重新打开并继续进行下一个活动

时间:2011-07-28 20:55:55

标签: java android android-homebutton

我写了这个应用程序,在第一个屏幕上它有一个包含的线程。因此,我将它计时为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();
    }
}

2 个答案:

答案 0 :(得分:2)

首先,这是一种非常低效的运行计时器的方法。请尝试这种方式:

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

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

}, delayTimeInMs);

其次,当计时器最终触发时,您开始新的活动。原始活动结束并不重要。你的startActivity()在它自己的线程上运行,无论如何都会执行。

postDelayed()方法可能会像您期望的那样运行。如果不是,你需要检查它是否应该真正开始活动。但是,我认为Handler附加到默认的Looper,这意味着如果主要活动结束,它将停止(或者更确切地说,不会发布消息)。

答案 1 :(得分:2)

应用程序仍处于后台,线程未被销毁,因此它将触发startActivity。

我不会以这种方式设置启动画面,或者使用线程,除非我出于某种原因想要它离开UI,即使这样有更好的选择。

出于教育目的来处理这个问题,你需要能够在onPause()中安全地中止线程,这样做的方法如下:

修改线程

    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;
    }
};