2014-08-28 14 views
5

è possibile impedire che Service (startForground) venga ucciso da os? Lo uso per riprodurre audio ma viene ucciso quando uso un'altra app che richiede più risorse (Angry birds go) per un po '. Nei registri vedo il processo di app ucciso da ActivityManager. L'ho replicato anche con alcune altre app audio. Solo l'app che non viene uccisa è l'app Play Music. E 'stato replicato su samsung s3 android 4.3.Servizio musicale eliminato anche quando startForground

+0

potrebbe essere il flusso audio è stato rilevato da un'app con priorità più alta. – danny117

risposta

5

E 'possibile evitare che Service (startForground) venga ucciso dal sistema operativo ?

No. È Android che decide quale processo deve essere fermato quando. L'unico modo è renderlo "meno attraente per essere fermato" riducendo la quantità di memoria che consuma.

Salvare memoria. Metti il ​​servizio nel suo piccolo processo. In modo che Android os può uccidere il processo principale per recuperare la memoria e il tuo servizio può continuare a funzionare. Mantenere un piccolo codice di servizio passando impostazioni e preferenze con l'intento utilizzato per avviare il servizio.

Nota: piccolo servizio deve essere un servizio di primo piano, il che significa che deve mostrare un icona nella barra di stato.

manifesta per il processo separato

 <service 
     android:name="com.gosylvester.bestrides.ServiceLocationRecorder" 
     android:process=":bestRidesService" > 
    </service> 
</application> 

passaggio nell'area di impostazioni con l'intento utilizzato per avviare il servizio. Riavvia semplicemente il servizio per modificare le impostazioni.

@Override 
public int onStartCommand(Intent intent, int flags, int startId) { 
    boolean isTrackerMarker = SettingMarker.TRACKER_MARKER_DEFAULT; 
    if (intent != null) { 
     // intent is processing = b 
     isMiles = intent.getBooleanExtra(
       SettingApplication.APPLICATION_MILE, 
       SettingApplication.APPLICATION_MILE_DEFAULT); 
     isRecordAccuracy = intent.getBooleanExtra(
       SettingRecord.RECORD_ACCURACY, 
       SettingRecord.RECORD_ACCURACY_DEFAULT); 
     locationInterval = intent.getLongExtra(SettingRecord.RECORD_MIlLIS, 
       SettingRecord.RECORD_PRESET_MEDIUM_MILLIS); 
     startMillis = intent.getLongExtra(BUNDLE_START_MILLIS, 0); 
     distance = intent.getDoubleExtra(
       ServiceLocationRecorder.BUNDLE_TRACKED_DISTANCE, 0); 
     recordDistance = (float) intent.getIntExtra(
       SettingRecord.RECORD_DISTANCE, 
       SettingRecord.RECORD_PRESET_MEDIUM_DISTANCE); 
     boolean newIsRecording = intent.getBooleanExtra(
       SettingRecord.RECORDING, isRecording); 

     isTrackerMarker = intent.getBooleanExtra(
       SettingMarker.TRACKER_MARKER, 
       SettingMarker.TRACKER_MARKER_DEFAULT); 
     startRecording(newIsRecording); 
    } 
+0

Grazie. L'ho provato. Ho inserito Service in un processo diverso ma sono stato anche ucciso dal gestore applicazioni dopo il processo principale. Ho anche impostato android.os.Process.setThreadPriority (android.os.Process.THREAD_PRIORITY_AUDIO); ma non è stato di aiuto – vandzi

+0

@vandzi continua a cercare scusa non ho potuto aiutare. – danny117

+0

Ho aggiunto un po 'più dettagli alla risposta. Il servizio minuscolo deve essere un servizio in primo piano. Questo riduce la probabilità di essere ucciso. Non esiste una soluzione migliore per Android. –

1

Hai provato a richiedere la messa a fuoco e il guadagno di controllo e ne hai perso? Penso che questa gestione delle app sia lontana dal nostro controllo, ma almeno puoi fare qualcosa quando ciò accade.

Ad un certo punto del ciclo app, provare qualcosa di simile:

audioManager.requestAudioFocus(new OnAudioFocusChangeListener() { 

     @Override 
     public void onAudioFocusChange(int focusChange) { 
      switch (focusChange) { 
       case AudioManager.AUDIOFOCUS_GAIN: 
        // you have the focus, you can start or restarting playing 
        break; 
       case AudioManager.AUDIOFOCUS_LOSS: 
       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT: 
        // you lost the focus, you should pause or stop playing 
        break; 
       case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 
        // you lost the focus, but your app can continue playing in "duck" mode 
        break; 
       default: 
      } 

     } 
    }, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN); 
+0

Grazie per la risposta. Tengo l'audiofocus – vandzi

0

Date un'occhiata alla risposta di Foreground service being killed by Android da Robin Davies, c'è un sacco di informazioni:

Proprio per riassumere, ecco come dovrebbero funzionare le cose. I servizi in esecuzione verranno regolarmente eliminati e terminati ogni 30 minuti circa. I servizi che desiderano rimanere in vita più a lungo devono chiamare Service.startForeground, che inserisce una notifica sulla barra di notifica, in modo che gli utenti sappiano che il servizio è attivo e potenzialmente in grado di aumentare la durata della batteria. Solo 3 processi di servizio possono nominarsi come servizi in primo piano in qualsiasi momento. Se ci sono più di tre servizi in primo piano, Android nominerà il servizio più vecchio come candidato per lo scavenging e la terminazione.

Quindi forse ci sono più di 3 servizi in primo piano? Spiega anche su possibili errori nella piattaforma quando si assegnano priorità ai servizi in primo piano.