Java Android应用程序重新打开并继续进行下一个活动,即使按下home按钮或back按钮

Java Android应用程序重新打开并继续进行下一个活动,即使按下home按钮或back按钮,java,android,android-homebutton,Java,Android,Android Homebutton,我写的这个应用程序在第一个屏幕上有一个包含的线程。所以我给它计时7秒,然后它将继续进行下一个活动 问题是,每当我按下home(主页)按钮时,音乐就会停止并进入android主屏幕,但在计时完成后(即7秒),应用程序将重新出现并显示下一个活动 我试着把finish()但它仍然显示下一个活动 这是实际的代码 public class HelloWorldActivity extends Activity { MediaPlayer mp; public void onCreate(

我写的这个应用程序在第一个屏幕上有一个包含的线程。所以我给它计时7秒,然后它将继续进行下一个活动

问题是,每当我按下home(主页)按钮时,音乐就会停止并进入android主屏幕,但在计时完成后(即7秒),应用程序将重新出现并显示下一个活动

我试着把
finish()onpause()中的code>但它仍然显示下一个活动

这是实际的代码

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();
    }
}
公共类HelloWorldActivity扩展活动{
MediaPlayer mp;
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.splash);
mp=MediaPlayer.create(this,R.raw.otj);
mp.start();
线程LogoTimer=新线程(){
公开募捐{
试一试{
int LogoTimer=0;
同时(LogoTimer<7000){
睡眠(100);
LogoTimer=LogoTimer+100;
}
startActivity(新意图(“com.example.HelloWorld.CLEARSCREEN”);
}捕捉(中断异常e){
e、 printStackTrace();
}
最后{
完成();
}
}
};
LogoTimer.start();
}
@凌驾
受保护的空onDestroy(){
//TODO自动生成的方法存根
super.ondestory();
mp.release();
}
@凌驾
受保护的void onPause(){
//TODO自动生成的方法存根
super.onPause();
mp.pause();
}
@凌驾
受保护的void onResume(){
//TODO自动生成的方法存根
super.onResume();
}
@凌驾
受保护的void onStop(){
//TODO自动生成的方法存根
super.onStop();
}
}

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

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

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

}, delayTimeInMs);
第二,当计时器最终启动时,启动一个新的活动。发起活动是否完成并不重要。startActivity()正在自己的线程上运行,并且将不受影响地执行


postdayed()方法可能会像您预期的那样工作。如果没有,您需要让它在运行时检查它是否真的应该启动活动。但是,我认为处理程序连接到默认的循环器,这意味着如果主活动完成,它将停止(或者更确切地说,消息不会被发布)。

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

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

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

}, delayTimeInMs);
第二,当计时器最终启动时,启动一个新的活动。发起活动是否完成并不重要。startActivity()正在自己的线程上运行,并且将不受影响地执行


postdayed()方法可能会像您预期的那样工作。如果没有,您需要让它在运行时检查它是否真的应该启动活动。但是,我认为处理程序已附加到默认循环器,这意味着如果主活动完成,它将停止(或者说,消息不会被发布)。

应用程序仍在后台,线程未被销毁,因此它将触发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;
    }
};

应用程序仍在后台,线程未被破坏,因此将触发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;
    }
};

我是按照一个教程,所以这是我遵循。我要离开这里了?像onpause()一样;顶部();onDestroy();等等。如果我不得不问这个问题,我真的只是一个android的初学者。是的,那些方法看起来不错。我还没有做任何媒体播放器的工作,所以我不知道推荐的获取和发布方法。我会尝试将MediaPlayer.create()放在onStart()中,并在onStop()中释放它,而不是在onDestroy()中释放它。好的,我让它工作了,当我尝试点击home按钮时,它不会再次返回到应用程序。非常感谢。现在我可能需要一本关于Android的Java好书,因为youtube上的教程并不是很好。我一直在关注一本教程,所以我就是这么做的。我要离开这里了?像onpause()一样;顶部();onDestroy();等等。如果我不得不问这个问题,我真的只是一个android的初学者。是的,那些方法看起来不错。我还没有做任何媒体播放器的工作,所以我不知道推荐的获取和发布方法。我会尝试将MediaPlayer.create()放在onStart()中,并在onStop()中释放它,而不是在onDestroy()中释放它。好的,我让它工作了,当我尝试点击home按钮时,它不会再次返回到应用程序。非常感谢。现在我可能需要一本关于Android的Java好书,因为youtube上的教程不是很好。我现在应该把startActivity放在哪里?哦,同样的地方,这只是一个框架,告诉你如何停止线程,但这里我将为你修改,站起来by@regi-见上文,但也要注意Walt的第一个解决方案使用runnable可能更适合您的目的,因为您没有做任何实际工作,我只是向您展示了如何解决问题,如果您有threadok,最后一件事。我的原始代码有什么不好的地方?那是一张图