2012-12-05 41 views
0

我在我的應用程序中有許多活動(例如A-> B-> C-> D)...我有一個倒計時器,用於會話超時..我所做的是創建一個靜態計數器...我在活動A開始計數器....如果用戶交互計數器被複位...這也適用於活動B,C,D ....也對完成活動D,活動一開始..因爲這我已經使用addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP),所以它清除堆棧...在android中處理靜態變量

但是會發生什麼當活動A重新開始..一個新的實例與前一個計數器一起創建,並繼續運行在背景....並沒有重置userinteration ...我已經在onDestroy中做了counter = null ....是對的還是我需要做點別的?

public class CountTime extends Activity { 

    TextView tv; 
    static MyCount counter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     tv = new TextView(this); 
     this.setContentView(tv); 
     // 5000 is the starting number (in milliseconds) 
     // 1000 is the number to count down each time (in milliseconds) 
     counter = new MyCount(5000, 1000); 
     counter.start(); 
    } 

    @Override 
    public void onUserInteraction() { 
     // TODO Auto-generated method stub 
     super.onUserInteraction(); 
     counter.start(); 
    } 

    // countdowntimer is an abstract class, so extend it and fill in methods 
    public class MyCount extends CountDownTimer { 
     public MyCount(long millisInFuture, long countDownInterval) { 
      super(millisInFuture, countDownInterval); 
     } 

     @Override 
     public void onFinish() { 
      tv.setText("done!"); 
     } 

     @Override 
     public void onTick(long millisUntilFinished) { 
      tv.setText("Left: " + millisUntilFinished/1000); 
     } 
    } 
    @Override 
    protected void onDestroy() { 
     // TODO Auto-generated method stub 
     super.onDestroy(); 
     counter = null; 
    } 
} 

回答

2

這是正常的Android行爲試試這個。

在任何時候的活動是不是前臺的活動,它可以根據一些非確定性的標準,這樣的可用內存,很多後臺應用程序是如何運行等

在你的情況下被破壞,活性A被被破壞,當你回到它時,一個新的實例被創建,它的onCreate()被調用。

一般而言,您不應該嘗試訪問來自其他活動的活動內的內容。

你可以擴展你的應用程序類並在那裏實例化你的計時器。

public class MyApplication extends Application{ 

    static MyCount counter; 

    @Override public void onCreate() 
    {  
     super.onCreate(); 
     counter = new MyCount(); 
    } 

} 

在您的清單

<application android:name="com.myname.MyApplication" 

時,才應使用此方法時,它的真正需要。請不要將所有內容放在擴展應用程序類中,以使事情變得簡單。這是非常糟糕的做法。

最後,沒有Android的契約,如果您的活動被破壞,onDestroy()將被調用。只有當你自己完成()活動時才能保證。你應該使用onPause()來完成當你的活動進入後臺(並且可能被銷燬)時需要發生的事情。

+0

所以你建議我必須爲每個活動使用一個單獨的計數器? – Audi

-1

您可以通過替換該行

counter = null; 

到行

counter.cancel();