0

我有一个每 1 秒增加 1 的计数器,在 TextView 中显示其当前值。

一切正常,直到 Activity 被销毁然后重新创建。在这些情况下,计数器重置为 0。

我读过我必须将计数器的代码放在自定义Service中,以便在后台执行。然后,我应该将我的 Activity(包含 TextView)与BroadcastServicer通信。

我已经遵循了一些关于 BroadcastReceivers 的教程,但我仍然不知道如何解决这个问题。

您能否向我展示将 BroadCastReceiver 与服务通信以更新 Activity 中的 TextView 的正确方法?

到目前为止,这是我的 Activity 代码:

public class CounterActivity extends Activity{
    private long startTime = 0;
    private Handler h = new Handler();
    private TextView tvCounter;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_task_list);
        tvCounter = (TextView)findViewById(R.id.tvCounter);

        Runnable run = new Runnable() {

            @Override
            public void run() {
               long millis = System.currentTimeMillis() - startTime;
               int seconds = (int) (millis / 1000);
               int minutes = seconds / 60;
               seconds     = seconds % 60;

               tvCounter.setText(String.format("%d:%02d", minutes, seconds));

               h.postDelayed(this, 500);
            }
        };

        startTime = System.currentTimeMillis();
        h.postDelayed(run, 0);
    }

}

提前致谢!

4

2 回答 2

2

consider using Async task and handlers to update UI components

于 2013-05-10T01:05:00.037 回答
2

您可以使用下面的代码保存您的 startTime,然后计数器不会重置~

protected void onSaveInstanceState(Bundle icicle) {
  super.onSaveInstanceState(icicle);
  icicle.putLong("starttime", startTime);
}

public void onCreate(Bundle savedInstanceState) {
  if (savedInstanceState != null){
     startTime = savedInstanceState.getLong("starttime");
  }else{
     startTime = System.currentTimeMillis();
  }
}
于 2013-05-10T02:16:12.233 回答