2016-12-14 53 views
0

주기적으로 백그라운드에서 작업을 실행하고 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!"); 
} 

내가 스레드가 디스플레이가 꺼져있는 경우에도 실행,하지만 내 로그 파일을보고 그렇게 될하지 보인다 것으로 기대 . 내가 어디서 잘못한거야?

+0

테스트 할 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 이것은 '새로운 MyThread(). start()'와 같이 작성된 작업자 스레드에도 적용됩니까? 안드로이드 개발자 가이드를 읽었지만, AlarmManager와 Network 관련 작업에 대해서만 이야기합니다. '배경 CPU를 연기했습니다'라는 말은 한 번, 전혀 설명하지 않았습니다. – Jenix

답변

2

Android 6.0 이상에서는 Doze mode이 기본적으로 사용자의 wakockock을 실행 취소합니다. 일부 제조업체의 6.0 이전 버전 장치도 비슷한 기능을 수행합니다.

도즈 모드를 피할 수 있습니까?

사용자는 배터리 최적화 허용 목록에 앱을 추가 할 수 있습니다. ACTION_REQUEST_IGNORE_BATTERY_OPTIMIZATIONSmay result in your app being banned from the Play Store을 통해 사용자에게이 작업을 요청하면 해당 채널이 배포 채널 중 하나였습니다.

또는 사용자는 항상 충전기에 기기를 보관할 수 있습니다.

폴링주기가 짧으면 setAndAllowWhileIdle() 또는 setExactAndAllowWhileIdle()AlarmManager으로 시도 할 수 있습니다. 기껏해야 9 분마다 통제권을 얻게됩니다. 인터넷에 접속하지 못할 수도 있습니다.

그렇지 않으면 장치 측 폴 매 N 분 접근이 중지됩니다.

Google은 GCM/FCM을 사용하고 필요할 때 서버가 정보를 푸시 다운하도록하여 폴링을 피하기를 원합니다. 그게 당신의 유스 케이스와 관련이 있는지 나는 모른다.

+0

대단히 @CommonsWare. 네,이 정보는 내 경우에 매우 유용하다. 내 목표는 주기적으로 백그라운드에서 P2P 피어 검색을 수행하여 주변에있는 새 장치를 찾을 수있게하는 것입니다. AlarmManager (매 9 분마다)로 WifiP2P 프레임 워크를 사용할 수 있습니까? –

+0

@MattiaCampana : WifiP2P를 사용하지 않았습니다. 그러나 'WifiLock'을 들고 있지 않으면 Doze에서 WiFi를 사용할 수 없으며 Doze 중에는 WiifLock 만 있으면 충분하지 않을 것으로 예상됩니다. 'WifiLock'과 Doze 사이의 상호 작용은 AFAIK 문서화되지 않았습니다. – CommonsWare

+0

@ CommonsWare 아, 한 가지 더! 아직도 WifiLock에 대해 확실하지 않습니까? – Jenix