2

複数のタイマーを備えたアプリがあります。開始すると、Eclipse の Logcat でカウントダウンが表示されます。

Backボタンを押すとonStop()、アプリで呼び出されますが、タイマーは logcat でカウントダウンを続けます (onTick()カチカチ音をたて続けています)。

私が望むのは、onResume()呼び出されたときに、まだカウントダウン中のタイマーを取得して続行したいということです。これは可能ですか?

カウントダウンを開始するボタンは次のとおりです。

//Button1 Timer
final CountDown button1 = new CountDown(420000,1000,bButton1);
bButton1.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        button1.start();
        long currentTime = System.currentTimeMillis();
        //Set start time for calculating time elapsed if needed
        saveTime("START_TIME_BUTTON1", currentTime);
    }
});     

//Button2 Timer
final CountDown button2 = new CountDown(360000,1000,bButton2);
bButton2.setOnClickListener(new OnClickListener() {

    @Override
    public void onClick(View v) {
        button2.start();
        long currentTime = System.currentTimeMillis();
        //Set start time for calculating time elapsed if needed
        saveTime("START_TIME", currentTime);
    }
}); 

onResume()はこのように見えます:

@Override
protected void onResume() {
    // TODO Auto-generated method stub
    super.onResume();

    //Reset the timers on appropriate buttons if there was something running
    //If nothing was running or timer finished - have button in default state

    //See if there was a button1 timer running - if not, it will be 0
    SharedPreferences start = PreferenceManager.getDefaultSharedPreferences(this);
    long startTime = start.getLong("START_TIME_BUTTON1", 0);
    long timeElapsed = (System.currentTimeMillis()-startTime);
    long timeRemaining = (420000 - timeElapsed);        
    if (timeRemaining == 0) {
    } else if (timeRemaining > 0) {
        final CountDown button1Timer = new CountDown(timeRemaining,1000,bButton1);
        button1Timer.start();
        long currentTime = System.currentTimeMillis();
            saveTime("START_TIME", currentTime);            
    } else {
    }
}

これは実際に機能します — はonResume()最初のタイマーがあった場所で別のタイマーを開始し、テキストは適切な数を表示し、onTick()メソッドでカウントダウンを続けます。しかし今、logcat は 1 つではなく 2 つのタイマーのカウントダウンを示しています!

最終的には、別のタイマーを開始したくありません。現在カウントダウン中の場所で開始した最初のタイマーを取得し、onTick()適切に表示したいだけです。それを行う方法はありますか?サービスは私が探しているものでしょうか? バックグラウンドでカチカチ音をたて続けているので、それはすでにサービスですか?

これを行うためのベストプラクティスは何かについて少し混乱しています。

4

1 に答える 1

4

onTick()残り時間が0に達するかcancel()、CountDownTimerを呼び出すまで、が呼び出され続けます。したがって、メソッドでは、通知の受信を停止するタイマーonStop()を呼び出す必要があります。cancel()onTick()

AndroidのCountDownTimerの実装では、を使用して、各ティックの後に送信されるHandleraをキューに入れてタイミングを実行します。残念ながら、CountDownTimerを一時停止する方法はないため、現在行っているように、適切な値で新しい値を作成する必要があると思います。MessageHandlerTimer

timeElapsedを計算するときはSystem.currentTimeMillis()、いつでも変更できるため、使用しないでください。代わりに、を使用する必要がありますSystemClock.elapsedRealtime()System.currentTimeMillis()は掛け時計(時刻と日付)に使用されるタイマーであるため、予期せず変更される可能性があります。Androidのドキュメントを参照してください。

于 2013-03-05T23:15:39.887 に答える