Android: il thread C ++ non si sveglia se lo schermo è bloccato o in background. Funziona bene quando l'applicazione è in uso

Nella nostra applicazione Android, abbiamo il componente UI e il module core C ++ 11. Un thread è in esecuzione basato su std::chrono::system_clock::time_point , come sotto:

 while(this->m_ConditionVariable.wait_until(lock, this->m_Object.to_time_point()) == std::cv_status::no_timeout) { // ... handle any notify() or arbitrary sleep breaks } Execute(); // <--- not being called consistently 

Ora stiamo testando con un tempo di 1 minuto. Se l'applicazione è in uso, l' Execute() viene invocata come previsto. Tuttavia, se l'applicazione viene spostata in background o se anche lo schermo è bloccato, il comportmento Execute() -s non è coerente.
A volte, può funzionare correttamente each minuto per 15 minuti e dopo che verrà richiamato dopo 2 minuti o 3 minuti o 10 minuti, anziché 1 minuto fisso. Utilizzando i debug, abbiamo verificato che il time_point fornito è corretto.

  • Il frammento di Android DatePicker restituisce la data di un mese prima
  • Come connettersi a un database MySQL da un'applicazione Android?
  • Come giocare un file video crittografato in Android
  • Uncaught ReferenceError: il cordova non è definito
  • Come aggiungere pulsanti in cima alla disposizione del frammento di mappa API v2
  • ToolBar scompare quando si imposta l'elevazione per AppBarLayout
  • Supponiamo che se esegui l'applicazione in modalità di debug (utilizzando Android Studio), funziona bene anche in modalità di background e block dello schermo.

    L'Android ha priorità di threading per l'applicazione in esecuzione in background?


    Aggiornamento 1 : Fondamentalmente il thread di background sta raccogliendo informazioni sulla posizione. Mi sono imbattuto sotto la domanda, che suggerisce che in Android, quando il telefono è bloccato, l'esecuzione del filo viene interrotta. Sono attaccato a questo problema?
    App sembra smettere di funzionare quando lo schermo passa a dormire

    Aggiornamento 2 : con block parziale di Wake , funziona bene. Ma non so se questa sia una buona soluzione. Se questo è l'unico modo, allora apprezzerò la strategia per come utilizzarla in modo ottimale.

    Aggiornamento 3 : Se sostituisco l' wait() con il sleep() più piccolo sleep() , funziona bene anche senza alcun block di Android wake. Tuttavia dobbiamo ancora eseguire test di tipo regressivo.

  • La Bottiglia morbida NavigationBar si sovrappone alla mia ListView
  • Imansible condividere l'image da dataDirectory tramite SocialSharing-PhoneGap-Plugin
  • Ottenere il tipo di colonna in SQLite
  • Come aggiornare la versione OpenSSL in CSipSimple?
  • Prendi il livello della batteria solo una volta usando Android SDK
  • L'aggiornamento di Android 17 sembra incompatibile con i Jars esterni
  • One Solution collect form web for “Android: il thread C ++ non si sveglia se lo schermo è bloccato o in background. Funziona bene quando l'applicazione è in uso”

    Quando il dispositivo è inattivo, la CPU viene arrestata e l'esecuzione di qualsiasi thread è in pausa (C ++ o Java). Se si sveglia per qualsiasi motivo il tuo thread C + + ricomincerà a lavorare nuovamente, quindi il comportmento random: altre applicazioni o servizi potrebbero svegliarsi each tanto.

    L'aggiunta di un block parziale funziona nel tuo caso, ma questo impedirà che la CPU entri intriggers, causando un certo scarico della batteria. Se non ti import puoi utilizzare questo approccio, se la batteria è in tensione, puoi utilizzare l'API di allarme Java per svegliare regolarmente il dispositivo. Quindi l'API java può call il codice C ++ tramite JNI .

    Documentazione Android per gli allarmi ripetuti: https://developer.android.com/training/scheduling/alarms.html

    Per l'aggiornamento 3, usando un piccolo sonno piuttosto che wait() , sospetto che android non sia in modalità di stand-by mentre un thread è in esecuzione, forse attende un piccolo timeout senza alcun thread attivo prima che vada inattivo. Questo approccio avrà lo stesso effetto sullo scarico della batteria rispetto alla chiusura della sveglia.

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.