0

TextView に現在の値を表示する 1 秒ごとに 1 ずつ増加するカウンターがあります。

アクティビティが破棄されてから再作成されるまで、すべてが正常に機能します。そのような場合、カウンターは 0 にリセットされます。

カウンターのコードをカスタムService内に配置する必要があることを読んだので、バックグラウンドで実行されます。次に、Activity (TextView を含む) をBroadcastServicerと通信する必要があります。

BroadcastReceivers に関するいくつかのチュートリアルに従いましたが、まだこの問題を解決する方法がわかりません。

アクティビティ内の TextView を更新するために、BroadCastReceiver とサービスを通信する正しい方法を教えてください。

これまでのアクティビティのコードは次のとおりです。

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

非同期タスクとハンドラーを使用して UI コンポーネントを更新することを検討してください

于 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 に答える