マイ アクティビティは、 を呼び出してサービスを開始します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()
、別のプロセスでこの問題が解決される可能性があります。しかし、私のソリューションが充電で機能する理由を知りたいです。また、サービスのこの「アイドル」状態に関する情報はどこにありますか。(タイマー スケジュールを実行していませんが、破棄されていません) ありがとうございます。