2010-10-18 10 views
14

He estado leyendo la documentación de Android y me pregunto si alguien puede arrojar algo de luz sobre lo que sucede con una instancia de servicio cuando un servicio iniciado con START_STICKY ha sido asesinado. Asumo que los datos del estado local (variables de instancia) también se pierden. ¿Hace algo Android para ayudar a volver a poblar el estado local cuando recrea el servicio?onStartCommand después de que se cancele el proceso de servicio cuando se inició con START_STICKY

Tenía algunos datos que se enviaron al servicio en un intento. En onStateCommand(), rellenaría los datos de la instancia del servicio en función de lo que se pretendía. Según lo que he leído en los documentos de Android, el intento pasado a onStartCommand() será nulo cuando el servicio haya sido cancelado y reiniciado (con START_STICKY). ¿Esto significa que pierdo tanto la intención como los datos del miembro del servicio cuando se recrea el servicio?

Respuesta

16

Cuando un proceso se cancela y se vuelve a crear, vuelve a pasar por todo el ciclo de vida (comenzando en onCreate). Dependiendo de cómo se mató y cómo se guardan los datos, puede o no estar disponible para usted.

En cuanto a obtener la intención de volver, hay una bandera para START_REDELIVER_INTENT que volverá a enviar la intención.

+0

Gracias por confirmar mis sospechas. No sabía acerca de START_REDLIVER_INTENT (debe haber pasado por alto esa parte de los documentos). – adstro

+0

Gracias, hombre, fui despedido por este error durante casi un mes ... Finalmente descubrí que el sistema operativo Android mató al servicio ... –

+0

Bien. Nunca supe lo de 'START_REDELIVER_INTENT', seguro que fue muy útil @Falmarri –

1

Android no volverá a llenar los valores de datos 'perdidos' cuando reinicie su servicio, por lo que su código debe atender esta eventualidad.

Mi enfoque es utilizar todas las variables de estado no primitivas y dejarlas como nulas. De esa forma puedo probar nulo y tomar los pasos apropiados para inicializarlos como y cuando.

He seguido almacenando datos livianos que deseo conservar durante los reinicios de la aplicación en las preferencias de la aplicación.

2

Recientemente me encontré con este mismo problema. El servicio no proporciona medios integrados para guardar el estado y el último intento puede no ser suficiente para que el servicio vuelva a su estado anterior. Mi solución fue mantener el estado de actividad y pasar ese estado al servicio a través de startService(). El servicio a continuación, sólo desencadena eventos en la actividad, como:

  • aquí es una actualización
  • algo murió y aquí está la excepción
  • Me han matado, por favor reinicie con cualquier estado necesario

Este enfoque limpió mucho mi diseño, y tanto el servicio como la actividad son resistentes a la muerte.

+2

¿Puedes compartir algún fragmento de código por el mismo .. ?? El concepto parece ideal, pero no puedo implementarlo –

1

utilice Almacenamiento interno para guardar objetos o su campo individualmente.

public void writeToInternalStorage(String fileName,String userName) 
    { 
     try{ 
      String endOfLine = System.getProperty("line.separator"); 
      StringBuffer buffer = new StringBuffer(); 

      FileOutputStream fos = openFileOutput(fileName, Context.MODE_PRIVATE); //// MODE_PRIVATE will create the file (or replace a file of the same name) and make it private to your application. Other modes available are: MODE_APPEND, MODE_WORLD_READABLE, and MODE_WORLD_WRITEABLE. 

      buffer.append(userName.toString() + endOfLine); 
      fos.write(buffer.toString().getBytes()); 


      Log.v(TAG, "writeFileToInternalStorage complete.. " + buffer.toString()); 
      //  writer.write(userName); 

      fos.close(); 
     } 
     catch(Exception e) 
     { 
      Log.v(TAG, "Error: " + e.getMessage()); 
      ExceptionNotificationMessage("writeToInternalStorage() Error: " + e.getMessage()); 
     } 
    } 

    public String readFromInternalStorage(String fileName) 
    { 
     try{ 
      File file = this.getFileStreamPath(fileName); 
      if(file.exists() == true) 
      { 
       Log.v(TAG, "readFileFromInternalStorage File found...");  

       FileInputStream fis = openFileInput(fileName); 
       StringBuilder buffer = new StringBuilder();    
       int ch; 
       while((ch = fis.read()) != -1){ 
        buffer.append((char)ch); 
       } 

       Log.v(TAG, "readFileFromInternalStorage complete.. " + buffer.toString()); 
       fis.close(); 

       return buffer.toString(); 
      } 
     } 
     catch(Exception e) 
     { 
      Log.v(TAG, "Error: " + e.getMessage()); 
      ExceptionNotificationMessage("readFromInternalStorage() Error: " + e.getMessage()); 
     } 
     return ""; 
    } 
Cuestiones relacionadas