주기적으로 백그라운드에서 작업을 실행하고 CPU를 계속 켜야합니다. 안드로이드 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 버전과 특정 하드웨어는 무엇입니까? 안드로이드 6.0은 도즈 (Doze) 모드를 도입했으며, 다양한 제조업체들은 도즈 (Doze)를 선보였던 공격적인 절전 모드를 가지고있다. 사용자가 앱을 배터리 최적화 허용 목록에 추가하지 않는 한, 2 분마다 ('ScheduledExecutorService','AlarmManager','JobScheduler' 등을 사용하여) 현대 Android 기기에서는 불가능합니다. – CommonsWare
Nexus 5 (Android 6.0.1)와 Nexus 6 (Android 7)을 사용하고 있습니다. Doze 모드를 피할 수 있습니까? –
@CommonsWare 이것은 '새로운 MyThread(). start()'와 같이 작성된 작업자 스레드에도 적용됩니까? 안드로이드 개발자 가이드를 읽었지만, AlarmManager와 Network 관련 작업에 대해서만 이야기합니다. '배경 CPU를 연기했습니다'라는 말은 한 번, 전혀 설명하지 않았습니다. – Jenix