2012-04-24 51 views
0

我有一個活動,我需要實現一個基本的mm :: ss計時器。以下是我爲它編寫的代碼。但問題是,當我在模擬器中按下後退按鈕並再次單擊該應用程序時,值變化更快。它看起來像onCreate再次被調用。我如何糾正這一點? 我已經嘗試創建一個布爾變量,並在第一次調用任務時將其設置爲true。我只在值爲false時才調用startPeriodidUpdates()。但是onCreate再次以false值創建變量。Android:onCreate被重複調用

public class GraphicsActivity extends Activity { 
static int seconds = 0; 
static int minutes = 0; 
public static String time_elapsed; 
public static boolean clearView = true; 
Handler myhandler = new Handler(); 
public static String min,sec; 
public static boolean running = true; 


    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 
    startPeriodicUpdates(); 

    } 
    public void onResume(){ 
    super.onResume(); 
    } 
    public void onPause() { 
    super.onPause();  
    } 
    public void onStop(){ 
    super.onStop(); 
    } 

    public void startPeriodicUpdates() 
    { 
periodicCall(); 
    } 
    public void stopPeriodicUpdates(){ 
    myhandler.removeCallbacksAndMessages(myhandler); 
    } 

    public void periodicCall() 
    { 

seconds++; 
if(seconds ==60) 
{ 
    seconds=0; 
    minutes++; 
    if(minutes==60) 
    { 
     seconds=0; 
     minutes=0; 
    } 
} 
// left-padding zeros to the minutes and seconds values 
min = String.format("%02d",minutes); 
sec = String.format("%02d",seconds); 
time_elapsed = min + ":" + sec; 
time_elapsed = min + ":" + sec + ""; 
myhandler.postDelayed(new Runnable(){ 
    public void run(){ 
     periodicCall(); 

    } 
},1000); 

}

回答

1

也許這將幫助:做一個週期位任務,正確的做法是在OnResume註冊的處理程序,並在OnPause註銷英寸(您可以註銷其他地方,但OnPause很重要)

+0

是那做正確的事情,但對我來說我希望計時器在運行即使我按下了模擬器中的後退按鈕,也會出現背景。 – hektor 2012-04-24 05:30:21

0

這可能不是解決上述問題的方法,但如果您只是想更新視圖並在給定時間內計數,可能要看看Chronometer。如果要倒計時並更新視圖,可以使用CountDownTimer

0

您可以使用共享首選項僅使用此方法一次。

//傳遞true首次

protected void storeSharedPrefs(Boolean value) { 
     /* 
     * Storing in Shared Preferences 
     */ 
     editor.putString("first", value); 
     editor.commit(); //Commiting changes 
    } 

檢查每個時間上加載應用程序,無論是其第一次和配置細節已經通過檢查SharedPreferences

private boolean first_time_check() { 
     /* 
     * Checking Shared Preferences if the user had pressed 
     * */ 
     Boolean first = uPreferences.getString("first", false); 

      return first; 
    } 
1

我認爲正確輸入其如果您使用服務來實現您的計時器,那更好。即使您推回按鈕,服務也會繼續運行。

Here你可以看到我前一段時間問過的一個問題。您可以使用服務查看自定義天文臺的實施。

要收到天文臺的價值活動只是需要有一個廣播接收器,如:

private BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context context, Intent intent) { 
     mMilis = intent.getLongExtra("milis",0); 
     String time = intent.getStringExtra("tiempo"); 
     // Do Something with the time 
    } 
};