Android:当我关闭应用程序时,Beep会继续

时间:2013-11-28 15:38:20

标签: android beep

我有问题。我的应用程序发出一些哔哔声,但当我关闭应用程序时,蜂鸣声继续,并且为了结束它,我必须从“任务管理器”关闭应用程序。这就是哔哔声的地方。

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

3 个答案:

答案 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();  
}