2016-12-14 5 views
0

バックグラウンドでタスクを定期的に実行し、CPUを起き続ける必要があります。 Android documentationによると、私はこの目的でPARTIAL_WAKE_LOCKを使用しました。 ウェイクロックをテストするために、ScheduledThreadPoolExecutorを使用して2分ごとにスレッドを開始するサービスを作成しました。このスレッドは、sdcardのログファイルに文字列を書き込むだけです。PARTIAL_WAKE_LOCKを使用してバックグラウンドスレッドを維持する

次に、次の簡単なテストを実行しました。アプリケーションを実行し、電源からデバイスのプラグを抜きます。 2〜3時間の正しい実行後、サービスはスレッドの実行を停止し、新しい文字列はログファイルに書き込まれません。

サービスのコード:

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

    Log.d(TAG, "Service onStartCommand"); 

    PowerManager pm = (PowerManager)getSystemService(Context.POWER_SERVICE); 
    wakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "WiOpp wakeLock"); 
    wakeLock.acquire(); 

    TestTask testTask = new TestTask(getApplicationContext()); 
    ScheduledThreadPoolExecutor monitorPool = new ScheduledThreadPoolExecutor(1); 
    monitorPool.scheduleAtFixedRate(testTask, 0, 120, TimeUnit.SECONDS); 

    return START_STICKY; 
} 

TestTaskのコード:

@Override 
public void run() { 
    //write on log file 
    LogManager.getInstance().logData("I am running!"); 
} 

私は、スレッドが、ディスプレイがオフされたときに実行されるが、私のログファイルを探して、そうではないように思われることを期待します。どこが間違っていますか?

+0

あなたがテストしているAndroidのバージョンと特定のハードウェアは何ですか? Android 6.0にはDozeモードが導入されました。さまざまなメーカーでは、Dozeの発売日以前の積極的な省電力モードを採用しています。ユーザーがあなたのアプリをバッテリー最適化ホワイトリストに追加しない限り、2分ごとに( 'ScheduledExecutorService'、' AlarmManager'、 'JobScheduler'などを使用して)何かを近代的なAndroidデバイスで行うことはできません。 – CommonsWare

+0

Nexus 5(Android 6.0.1)とNexus 6(Android 7)を使用しています。 Dozeモードを避けることは可能ですか? –

+0

@CommonsWareこれは 'new MyThread()。start()'のように作成されたワーカースレッドにも適用されますか?私はアンドロイドの開発者ガイドを読んでいますが、それはAlarmManagerとNetwork関連の仕事についてしか語っていません。「バックグラウンドCPUを延期する」と言われました。 – Jenix

答えて

2

Android 6.0以降では、Doze modeは基本的にあなたのワockロックを元に戻します。一部のメーカーの6.0より前のデバイスも同様のことをしています。

Dozeモードを回避できますか?

ユーザーはバッテリー最適化ホワイトリストにあなたのアプリを追加できます。ユーザーにACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSmay result in your app being banned from the Play Store(これが配信チャネルの1つである場合)を介してこれを行うように要求することに注意してください。

または、ユーザーはいつでも充電器にデバイスを置くことができます。

ポーリング期間が短くなる場合は、setAndAllowWhileIdle()またはsetExactAndAllowWhileIdle()AlarmManagerと試してみてください。最高で、あなたは9分ごとにコントロールを得るでしょう。ただし、インターネットにアクセスできない場合があります。

そうしないと、デバイス側のポーリングごとにN分のアプローチが破棄されます。

Googleは、GCM/FCMを使用して、この必要が生じた場合にサーバーが情報をプッシュダウンするようにして、ポーリングを避けたいと考えています。あなたのユースケースに関連するかどうかは分かりません。

+0

大変ありがとう@CommonsWare。 はい、この情報は私の場合に非常に便利です。 私の目的は、近隣の新しいデバイスを見つけるために定期的にバックグラウンドでP2Pピア発見を実行できるようにすることです。 AlarmManagerを使用すると(9分ごとに)WifiP2Pフレームワークを使用できますか? –

+0

@MattiaCampana:私はWifiP2Pでプレイしていません。しかし、あなたが「WifiLock」を持っていない限り、私はDozeの間にWiFiを利用できないと思うだろうし、Dozeの間にWifiLockで十分であるかどうかわからない。 'WifiLock'とDozeのインタラクションはAFAIKには書かれていません。 – CommonsWare

+0

@CommonsWareああ、もう一つ!まだWifiLockについてわからないのですか? – Jenix

関連する問題