2013-11-28 49 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的更多信息。