バックグラウンドでタスクを定期的に実行し、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!");
}
私は、スレッドが、ディスプレイがオフされたときに実行されるが、私のログファイルを探して、そうではないように思われることを期待します。どこが間違っていますか?
あなたがテストしているAndroidのバージョンと特定のハードウェアは何ですか? Android 6.0にはDozeモードが導入されました。さまざまなメーカーでは、Dozeの発売日以前の積極的な省電力モードを採用しています。ユーザーがあなたのアプリをバッテリー最適化ホワイトリストに追加しない限り、2分ごとに( 'ScheduledExecutorService'、' AlarmManager'、 'JobScheduler'などを使用して)何かを近代的なAndroidデバイスで行うことはできません。 – CommonsWare
Nexus 5(Android 6.0.1)とNexus 6(Android 7)を使用しています。 Dozeモードを避けることは可能ですか? –
@CommonsWareこれは 'new MyThread()。start()'のように作成されたワーカースレッドにも適用されますか?私はアンドロイドの開発者ガイドを読んでいますが、それはAlarmManagerとNetwork関連の仕事についてしか語っていません。「バックグラウンドCPUを延期する」と言われました。 – Jenix