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