2

マイ アクティビティは、 を呼び出してサービスを開始しますstartservice()。私の問題を単純化するために、サービスがカウンターになり、カウンターが 10 秒ごとに増加するとします。

Timer t_counter;
int counter = 0; 

@Override   
public int onStartCommand(Intent intent, int flags, int startId) {

    t_counter = new Timer();
    t_counter.schedule(new TimerTask() { 
        @Override
        public void run() {
            counter++;
            Log.d("counter: ",Integer.toString(counter));
        }}, 0, 10000);

    return Service.START_STICKY;
}   

電話が充電されているとき (またはデバッグ モード - が表示されているためLogcat)、サービスは期待どおりに動作します。アプリがバックグラウンドかどうかに関係なく、約 10 秒ごとLogcatにデバッグ情報が表示されます。しかし、電話のプラグを抜くと、しばらくするとサービスが停止します。アプリ(サービスを開始したアクティビティ)がアクティブなときのイベント。サービスが破棄されていない、単に保留されている、またはこのようなものであることに注意してください。

携帯電話を再び接続すると、タイマーが継続し、電話を抜いたときの値からカウンターの値が増加するためです。したがって、サービスが破棄された場合、値は再びゼロになります。(また、サービスのライフサイクルをデバッグしていてonStartCOmmand()onDestroy()が表示されない場合は、 と呼ばれていたはずです)

解決策を検索しましたが、この動作に対する正しい答えが見つからなかったと思います。AlarmManagerタイマーの代わりに使用する必要があることはわかっています。または、サービスをフォアグラウンドに配置しても機能するかstartForeground()、別のプロセスでこの問題が解決される可能性があります。しかし、私のソリューションが充電で機能する理由を知りたいです。また、サービスのこの「アイドル」状態に関する情報はどこにありますか。(タイマー スケジュールを実行していませんが、破棄されていません) ありがとうございます。

4

1 に答える 1

1

lockサービスをバックグラウンドで実行する必要がある場合は、保留する必要があります

PowerManager pm = (PowerManager) getSystemService(Context.POWER_SERVICE);
PowerManager.WakeLock wl = 
                      pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "My Tag");
wl.acquire();
// when you done
wl.release();

AlarmManagerサービスを常に実行し続けると、バッテリーが消耗し、システムリソースが浪費されるため、使用するのがより良い方法です。

于 2013-02-17T18:11:02.257 に答える