Mantenimento di un servizio di background vivo in Android

In riferimento all'accelerometro sembra funzionare solo per alcuni secondi?

Sto usando l'evento di trasmissione BOOT_COMPLETED per call quanto segue:

  • Mercurial ignore-file per Eclipse e sviluppo Android
  • android comunicano tra attività e ricevitore broadcast
  • Come importre RecyclerView per l'anteprima di Android L
  • Phonegap - Imansible scaricare l'archivio dal server
  • Android WebView all'interno di ScrollView scorre solo per la scorrimento
  • ADB Ricevi broadcast BOOT_COMPLETE
  • public class OnBootReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Intent service = new Intent(context, ShakeEventService.class); context.startService(service); } } 

    Che a sua volta chiama questo:

     public class ShakeEventService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { sManager = (SensorManager) getSystemService(SENSOR_SERVICE); sensor = sManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER); sManager.registerListener(thisSensorEventListener, sensor, SensorManager.SENSOR_DELAY_NORMAL); return Service.START_STICKY; } } 

    Ci sono molte altre funzioni e ciò che non c'è all'interno di questa class, ovviamente e tecnicamente tutto funziona bene, a less che, a prescindere da quale bandiera restitui (START_STICKY, START_STICKY_COMPATIBILITY, START_NOT_STICKY o START_REDELIVER_INTENT), il servizio viene ucciso dopo qualsiasi punto tra 5 e 25 minuti e non riavviare fino all'avvio successivo.

    Ho letto molto su Android 4.2 introducendo nuove ottimizzazioni delle batterie che eliminano i processi di background e ho letto tutti i tipi di report di bug con START_STICKY che non funzionano più, ma i vari work-around sembrano non fare alcuna differenza nella mia caso. Non sono sicuro se sto tentando di implementarle in modo errato o se queste soluzioni di lavoro hanno appena smesso di lavorare nelle versioni più recenti. Il mio dispositivo di prova è in esecuzione 5.1.1.

    Sono a un certo punto una perdita e apprezzerò ancora un aiuto.

    EDIT Per chiunque altro inciampa in questo problema, la risposta accettata di seguito include un wakelock funzionante che mantiene il servizio in vita su Nexus 7 che esegue Android 5.1.1 e LG G4 che esegue Android 6.

    Inoltre, prefiggendo l'android: l'attributo di process del file manifesto con un colon sembra importnte per mantenere il wakelock in atto. Ref http://developer.android.com/guide/topics/manifest/service-element.html

    Ancora nessuna fortuna su un Samsung S6 Edge che esegue lo stesso Android 5.1.1 però, quindi sembra che Samsung implementa qualcosa all'interno delle loro ottimizzazioni della batteria che sta causando una morte prematura.

  • Salvare Bitmap in File - Xamarin, Monodroid
  • come rimuovere in modo programmaticamente l'icona che lampeggia gps dalla barra di stato in android (o non farla mai lampeggiare)?
  • Come get SD_Card path in android6.0 in modo programmato
  • Allinea un'icona con l'icona della barra degli strumenti - Disegno materiale di Android
  • Differenza tra ActionBarActivity e attività di frammento
  • Programmaticamente scarica APK dal negozio google play
  • 3 Solutions collect form web for “Mantenimento di un servizio di background vivo in Android”

    È necessario utilizzare un Wakelock Parziale con il servizio. Se il tuo servizio è interattivo con l'utente, puoi prendere in considerazione la priorità del servizio.

    Questo è un esempio di lavoro per un Wakelock Parziale:

    Utilizzare questo momento quando il servizio è stato avviato:

      PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE); PowerManager.WakeLock cpuWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, TAG); cpuWakeLock.acquire(); 

    Quando il servizio viene arrestato, call cpuWakeLock.release();

    importzioni android.support.v4.content.WakefulBroadcastReceiver che Android Studio mi sta dicendo non esiste.

    È necessario importre la libreria di supporto .

    Tutto quello che devi fare per avere un servizio costantemente vivo è:

     <!-- BackGroundService Service --> <service android:name="com.settings.BackgroundService" android:enabled="true" android:exported="false" android:process=":my_process" /> 

    2) onStartCommand dovrebbe restituire:

      return Service.START_STICKY; 

    e questo è tutto amico dopo aver avviato il servizio dall'attività principale in cui è attivo per tutto il giorno /

    Per fare il trucco, utilizzare JobScheduler e JobService che consentono di eseguire il codice periodicamente.

    In primo luogo creare una class che estende JobService, quindi implementare i methods necessari e aggiungere il codice di servizio / avviare un altro servizio dal metodo JobService onStartJob ().

    Ecco un esempio per eseguire periodicamente un'operazione JobService:

     ComponentName serviceComponent = new ComponentName(context, yourJobService.class); JobInfo.Builder builder = new JobInfo.Builder(0, serviceComponent); builder.setRequiredNetworkType(JobInfo.NETWORK_TYPE_UNMETERED); builder.setRequiresDeviceIdle(false); builder.setRequiresCharging(false); builder.setPeriodic(60000); // <<<<---- 60 seconds interval JobScheduler jobScheduler = (JobScheduler)context.getSystemService(Context.JOB_SCHEDULER_SERVICE); jobScheduler.schedule(builder.build()); 

    Qui potete trovare ulteriori informazioni: https://developer.android.com/reference/android/app/job/JobService.html

    In bocca al lupo!

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