2016-10-27 5 views
0

私はこの問題で私の知恵の終わりです。それに対して良い解決策を見つけることができません!私のアプリでは、タイマーが何度も何度もスケジュールされているサービスがあります。つまり、各timerTaskが実行された後、別のタスクが開始されます(最初に、timerとtimerTaskの両方がキャンセルされ、新しいTimerおよびTimerTaskが割り当てられます)。これは24時間いつでも実行できます!私はこれが必要です:まず、アプリケーションを起動し、サービスを開始し、ディスプレイをオフにして、デバイスを一台のままにしておきます。しかし、問題は私がデバイスに戻ってくるたびに、私はいくつかのタスクを完了していることがわかりますし、その時間間隔が経過しているにもかかわらず、タイマーに立ち往生しています!私はこれがCPUスリープのためだと思います。Androidの場合、ディスプレイがオフのときにCPUをオンにしますか?

詳細については、時間間隔のリストが秒単位であるとします。{60,100,40,120,80}。私はサービスを開始し、デバイスを5分間放置します。その後、私は戻ってきて、60秒と100秒での作業が完了したことを確認します。しかし、このサービスは40時の作業に止まっています!

各タスクには、最大で5秒かかる非常に単純なネットワークジョブが含まれています。 私はウェイクロックを試みましたが、助けにはなりません。どうしてか分かりません!ここで

は私のサービスのコードです:

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    startForeground(id, new Notification()); 
    pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    wl = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK,""); 
    wl.acquire(); 
    doAction(); 
    return START_STICKY; 
} 

private void doAction(){ 
    if (timer != null) 
     timer.cancel; 
    if (timerTask != null) 
     timerTask.cancel; 
    timer = new Timer(); 
    timerTask = new TimerTask() { 
      @Override 
      public void run() { 
       doAction(); 
       //Do some network job! 
      } 
    }; 
    timer.schedule(timerTask, getNewInterval()); 
} 
+0

を使用してアラームをリセットできます。このデバイスは常に充電器に接続されますか? – CommonsWare

+0

そうではありません。 – Jay

+0

〜40-120秒ごとにネットワークI/Oを1日中連続して実行しようとしているため、GoogleがAndroid 6.0+で対策を講じて、そのようなアプリが実行されないようにしています。ユーザーは、過去数年間、Android搭載機器の電池性能の低下について一貫して不満を募らせています。そのようなことは、あなたが提案したことをやっている開発者に戻っています。ユーザーは、1日に数回デバイスを充電する必要性に対処するために十分なほどあなたのアプリを評価しますか? – CommonsWare

答えて

1

あなたはwakelockを保つべきではないと、おそらくいくつかの電源管理システムの機能は、このために、あなたのサービスを殺します。ドキュメントを読む:

WakefulBroadcastReceiver

AlarmManager

と最初のオプションまたはIntentServiceと、たとえば組み合わせ秒1が要件を満たすことができないかどうかを確認します。 AlarmManagerによって別の瞬間に、さらに正確には、setExact()

+0

答えをありがとう。やってる! – Jay

関連する問題