2013-11-28 47 views
0

我遇到问题。我的应用程序做了一些嘟嘟声,但是当我关闭应用程序时,嘟嘟声继续,并结束它,我必须从“任务管理器”关闭应用程序。这是哔声的发音。Android:当我关闭应用程序时蜂鸣声继续

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工作到同时与

`

@Override 
public void onStop(){ 
    super.onStop(); 
    some_public_flag = false; 
}` 

回答

0

您需要以某种方式退出while(true)循环。当你启动这个方法,并且当你退出应用程序/或者一个特定的屏幕将该变量设置为false时,将全局变量设置为true。

如果从活动做到这一点:

public void onDestroy() { 
    super.onDestroy(); 
    if(isFinishing()) { 
     // set the variable to false 
    } 
} 

你的方法将改变为: 私人无效playAlertTone(最终上下文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(); 
} 
0

必须调用.finish()关闭整个应用程序,因为它仍然会在后台运行,并发出蜂鸣声..你确定你正在完成你的应用程序?

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的更多信息。