2012-03-03 4 views
0

毎秒テキストビューを更新する簡単なタイマーアプリケーションを作成しました。 合計100秒間、10秒ごとにビープ音を鳴らしたい。 はBasciallyこれは、私はそれ(非常に概略的な)作った方法です:携帯電話のディスプレイがオンのとき画面がオフになってからpostAtTimeが適切なタイミングで起動しないのはなぜですか?

static long second, ticker, uptimemilli; 
onCreate() { 
    second = ticker = 0; 
    Handler mHandler = new Handler(); 
    uptimemilli = SystemClock.uptimeMillis(); 
    mHandler.postAtTime(mUpdateTimeTask, uptimemilli+1000*ticker++); 
} 

private Runnable mUpdateTimeTask = new Runnable() { 
    public void run() { 
    if (second == 100) 
     return; 
    UpdateMyTextView(second++); 
    if (second%10 == 0) 
     PlayBeep(); 
    mHandler.postAtTime(mUpdateTimeTask, uptimemilli+1000*ticker++); 
    } 
}; 

これはうまく動作します。 TextViewは毎秒更新され、10秒ごとにビープ音が鳴ります。しかし、私はディスプレイをオフにしても、ビープ音が10秒ごとに鳴るようにしたい。問題は、私が(電源ボタンを短くクリックして)それを行うと、タイマーのループがスローモーションになっているように見えることです。たぶん20〜25秒ごとにビープ音が出ます。したがって、postAtTimeは、画面がオフになっても動作しないように見えます。誰もがなぜ、どのように私は画面がオフになっても指定時にトリガするpostAtTimeを作ることができますか?

答えて

2

問題は、(電源ボタンを短く押して)タイマーループがスローモーションになっているようです。たぶん20〜25秒ごとにビープ音が出ます。

あなたがそれを得ている唯一の理由は、デバイスが20〜25秒ごとに電源を再投入しているためです。画面が暗くなった直後に、CPUの電源が切れ、アプリケーションがもう実行されなくなります。

したがって、画面がオフになってもpostAtTimeは機能しないように見えます。

postAtTime()は完全にうまくいきます。デバイスは単にスリープモードです。

デバイスがスリープモードになっているので、誰が、なぜ

を知っています。

画面がオフになっても指定した時点でpostAtTimeをトリガーするにはどうすればよいですか?

android:keepScreenOnなど、デバイスがスリープモードに入るのを停止します。

+0

ありがとうございました!短いフォローアップの質問。 AlarmManagerは、画面が暗くなった後、特定の時刻に何かをトリガする唯一の方法ですか? – Anders

+0

@アンダー:「AlarmManagerは、画面が暗くなってから特定の時間に何かをトリガーする唯一の方法ですか?確かに最も電力効率の良い方法です。それ以外の場合は、いつでもデバイスの電源をオンにする必要があります(例えば、「WakeLock」)。 – CommonsWare