2010-11-19 19 views
5

Escribí un programa de Android que: tiene una actividad principal para la interfaz de usuario, y comienza un servicio. El servicio devuelve de manera oportuna la actividad de UI para actualizar las vistas. Funciona bien excepto que: si la actividad está cerrada (con ATRÁS) y comienza de nuevo, el servicio también se iniciará de nuevo (El servicio reproduce el archivo de audio, por lo que hay dos sonidos superpuestos). Uso bindService con el indicador BIND_AUTO_CREATE para iniciar y conectarme al servicio. De acuerdo con el documento, debería crear servicio solo si no existe, pero obviamente comienza otra instancia cuando se abre por segunda vez. Todo lo que quiero es que la actividad se cierre, el servicio continúe ejecutándose y, cuando la actividad se vuelva a abrir, se pueda volver a conectar al servicio. ¿Es eso posible? ¿O simplemente no entiendo el uso del servicio?¿Por qué se destruye el servicio remoto cuando se cierra la actividad principal?

Probado más: Utilice ICountService (descrito en .aidl) en lugar de CountService en bindService Intent. Se usa Destroyed cuando la actividad está cerrada.

A continuación se muestra un código de servicio que crea si ayuda.

ServiceConnection conn = new ServiceConnection(){ 
    @Override 
    public void onServiceConnected(ComponentName c, IBinder b) { 
     Log.d("TK","Connected"); 
     //binder = (ICountService.Stub) b; 
     service = ICountService.Stub.asInterface(b); 
     try { 
      service.setCallback(new ICountCallback.Stub(){ 

       @Override 
       public void alert() { 
        Log.d("TK","alert!"); 
       } 

       @Override 
       public void updateTime(final int sec) { 
        handler.post(new Runnable(){ 

         @Override 
         public void run() { 
                  indicator.setText(toText(sec)); 
         } 

        }); 
       }    
      }); 
     } catch (RemoteException e) { 
      e.printStackTrace(); 
     } 
    } 

    @Override 
    public void onServiceDisconnected(ComponentName c) { 
     Log.d("TK","Disconnected"); 
    }   
}; 

private void startCountService(){ 
    Intent i = new Intent(ICountService.class.getName()); 
    boolean ok = context.bindService(i, conn, Context.BIND_AUTO_CREATE); 
    Log.d("TK", "bindService="+ok); 
} 

Respuesta

7

De acuerdo con el documento, se debe crear el servicio sólo si no existe, pero es obvio que se inicia otra instancia cuando se abrió por segunda vez.

bindService() creará la instancia de servicio si el servicio no se está ejecutando. unbindService() destruirá la instancia de servicio si no hay otras conexiones enlazadas y nadie llamó al startService(). Si el servicio se destruye en unbindService(), un bindService() posterior creará una nueva instancia de servicio.

en mi humilde opinión, lo ideal sería unbindService() no destruir inmediatamente el servicio, pero permitir que siga así durante unos segundos en primer lugar, en caso de que haya un bindService() poco después de la unbindService(). Sin embargo, esa no es la forma en que lo implementaron.

Lo único que quiero es que la actividad se cierre, el servicio siga funcionando y, cuando la actividad se vuelva a abrir, se pueda volver a conectar al servicio.

Debería utilizar startService() y stopService() en lugar de (o posiblemente además) de bindService() y unbindService().

+0

Gracias. start/stopService no funciona. Intenté más y descubrí que el servicio se destruye realmente cuando se cierra la actividad (se llama a CountService.onDestroy). El problema ahora es: ¿cómo evitar que se destruya el servicio? – Reno

+0

@Reno: use 'startService()'. Créalo o no, funciona. – CommonsWare

+0

Gracias. Finalmente se pone a trabajar. Ahora uso esto: cuando comienzo la actividad, 1) startService, 2) bindService sin BIND_AUTO_CREATE; cuando detenga la actividad, solo desvincularServicio, no stopService – Reno

-2

Esto fue trabajado para mí.

Main.java

public class Main extends Activity { 
    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     startService(new Intent(Main.this, MyService.class)); 

     try{ 

      MyService.setMainActivity(this); 

     }catch(Exception e){ 

      //t.setText(e.getMessage()); 

     } 
    } 
} 

MyService.java

public class MyService extends Service { 
    private Context ctx; 
    public static Main main; 
     @Override public IBinder onBind(Intent intent) {   
     // TODO Auto-generated method stub  
     return null; 
    }  

    public void onCreate() 
    { 
     super.onCreate(); 
     ctx = this; 
     startService(); 
    } 

    @Override public void onDestroy() {   
     // TODO Auto-generated method stub  
     Log.d("ASAS","Destroy"); 
     super.onDestroy(); 
    } 

    public static void setMainActivity(Main activity) { 
     main = activity; 
    } 

    private void startService() 
    {   
     //timer.scheduleAtFixedRate(new checkdata(),0,30000); 
    } 
} 
+1

Debe agregar alguna explicación para que las respuestas sean más útiles. –

+0

Agregue algunos comentarios para el código anterior. – SoH

Cuestiones relacionadas