2017-06-18 5 views
0

私のアプリでは、バックグラウンドサービスがあり、このサービスは定期的な操作(UIスレッドで実行できない入出力操作)これは:Androidサービスで起動されたスレッドは、デバイスがオンになるまで停止します

while(!stop){ 
    do_io_things(); 
    Thread.sleep(5000); 
    print_log(); 
} 

私は、デバイスが、スレッドが5秒以上眠るスリープモードになったときに、時にはそれが分かそこらのために寝ることに気づいたが、デバイスが起きている時に(私のアプリがある場合でも、バックグラウンドで)スレッドは期待どおりに動作します。ログを見て確認することができます。

AFAIKスリープメソッドは、それに渡される時間にコミットする必要があります、体は何が起こっているか知っていますか?デバイスがスリープモードになっているとき、Androidシステムはスリープ時間を延長しますか?

ご了承ください。

編集:私は複数のデバイスをチェックしてみました

は、実際に新しいデバイス上の問題は、時間の変更はキットカット4.4睡眠の変更を実行している古いデバイス上で、その大きなではないとしてあまり効果的であると思われます時間は重要です。あなたは、バッテリーの最適化について読むこの記事を読みたい場合は

+2

あなたのAndroidバージョン? –

答えて

2

は:breafで

https://developer.android.com/training/monitoring-device-state/doze-standby.html

、Androidデバイスは、数秒後に眠りに落ちます。いくつかのベンダーは、フォアグラウンドタスクを使用して起床しようとしても、すべてのプロセスを強制終了します。

ソリューション:デバイスを言ってordedで

  • 使用AlarmManagerは、 "しばらくの間、目を覚ますしてください"。
am = (AlarmManager) ctx.getSystemService(Activity.ALARM_SERVICE); 
am.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, nexttime, pi); 
  • あなたの現在のサービスのための 'ウェイクアップモード' をオンに
PowerManager pm = (PowerManager) ctx.getSystemService(Context.POWER_SERVICE); 
      wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
        PowerManager.ACQUIRE_CAUSES_WAKEUP | 
        PowerManager.ON_AFTER_RELEASE, APPNAME + Integer.toString(index)); 
     if (wakeLock.isHeld()){ 
      wakeLock.acquire(); 
     } 

それにもかかわらず、第二の溶液は、現代のすべてのデバイスに殺されます。

+0

情報をありがとう、実際に私の問題は、プロセスが殺されているのではなく、スリープメソッド – ammcom

+0

@ammcomの待ち時間にあるので、 'PowerManager' – Vyacheslav

関連する問題