我有问题。我的应用程序发出一些哔哔声,但当我关闭应用程序时,蜂鸣声继续,并且为了结束它,我必须从“任务管理器”关闭应用程序。这就是哔哔声的地方。
private void playAlertTone(final Context ctx){
t = new Thread()
{
public void run()
{
player = MediaPlayer.create(ctx, R.raw.beep_1);
while(true)
{
if( appDegree != -1 )
{
if( getDistance() <= 5 )
player = MediaPlayer.create(ctx, R.raw.beep_4);
else if( getDistance() <= 50 )
player = MediaPlayer.create(ctx, R.raw.beep_3);
else if( getDistance() <= 120 )
player = MediaPlayer.create(ctx, R.raw.beep_2);
else
player = MediaPlayer.create(ctx, R.raw.beep_1);
}
else
player = MediaPlayer.create(ctx, R.raw.beep_1);
player.start();
try
{
Thread.sleep(player.getDuration());
player.release();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.start();
}`
是的我只是从应用程序切换到主屏幕。
使用some_public_flag进入while和
`
@Override
public void onStop(){
super.onStop();
some_public_flag = false;
}`
答案 0 :(得分:1)
这是因为当您关闭活动时,线程继续工作。 您应该设法在onStop活动方法中中断线程。 尝试添加此代码:
@Override
public void onStop(){
super.onStop();
t.interrupt();
}
无论如何,当你在Android中说“我关闭应用程序”时可能含糊不清:你是从应用程序退出还是只是从应用程序切换到主屏幕? 在第一种情况下,您必须在活动中调用函数finish()(例如:在onClickListener内部或在onClose方法中)。如果您只是按下后退按钮切换到主屏幕,则表示您没有关闭应用程序,只是在暂停模式下将活动移至后台,这不会阻止线程完成运行。
如果您想在用户切换回应用程序时唤醒您的线程,您可以覆盖onStart方法。
@Override
public void onStart(){
super.onStart();
t.run();
}
注意:当应用程序实际退出时,就会调用onDestroy方法,如果它在后台,它就处于停止模式。您可以阅读有关活动生命周期here的更多信息。
答案 1 :(得分:0)
您必须致电.finish()
关闭整个应用,因为它仍会在后台运行并发出哔哔声。您确定要完成应用吗?
答案 2 :(得分:0)
您需要以某种方式退出while(true)
循环。启动此方法时以及退出应用程序/或将该变量设置为false的特定屏幕时,将全局变量设置为true。
如果你从活动中做到这一点:
public void onDestroy() {
super.onDestroy();
if(isFinishing()) {
// set the variable to false
}
}
您的方法将更改为: private void playAlertTone(final Context ctx){
t = new Thread()
{
public void run()
{
some_public_flag = true;
player = MediaPlayer.create(ctx, R.raw.beep_1);
while(some_public_flag)
{
if( appDegree != -1 )
{
if( getDistance() <= 5 )
player = MediaPlayer.create(ctx, R.raw.beep_4);
else if( getDistance() <= 50 )
player = MediaPlayer.create(ctx, R.raw.beep_3);
else if( getDistance() <= 120 )
player = MediaPlayer.create(ctx, R.raw.beep_2);
else
player = MediaPlayer.create(ctx, R.raw.beep_1);
}
else
player = MediaPlayer.create(ctx, R.raw.beep_1);
player.start();
try
{
Thread.sleep(player.getDuration());
player.release();
} catch (InterruptedException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
};
t.start();
}