¿Por qué se destruye el servicio remoto cuando se cierra la actividad principal?

Escribí un programa de android que: tiene una actividad principal para la interfaz de usuario, y se inicia un servicio. El servicio devuelve llamadas oportunas a la actividad de la interfaz de usuario para actualizar las vistas. Funciona bien excepto: si la actividad se cierra (con BACK) 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). Utilizo bindService con el indicador de BIND_AUTO_CREATE para comenzar y para conectar con el servicio. De acuerdo con el documento, debe crear servicio sólo si no existe, pero, obviamente, comienza otra instancia cuando se abre la segunda vez. Todo lo que quiero es cuando la actividad se cierra, el servicio sigue funcionando y cuando la actividad se abre de nuevo, puede volver a conectarse al servicio. ¿Es eso posible? O simplemente malinterpretar el uso del servicio?

Intentado más: Utilice ICountService (descrito en .aidl) en vez de CountService en bindService Intent. Se llama onDestroyed cuando se cierra la actividad.

A continuación se muestra el código de creación de servicio 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); } 

De acuerdo con el documento, debe crear servicio sólo si no existe, pero, obviamente, comienza otra instancia cuando se abre la 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 llama a startService() . Si el servicio se destruye en unbindService() , entonces un bindService() posterior bindService() creará una nueva instancia de servicio.

IMHO, idealmente, unbindService() no destruiría inmediatamente el servicio, pero lo detendrá por unos segundos primero, en caso de que haya un bindService() poco después de unbindService() . Sin embargo, no es así como lo implementaron.

Todo lo que quiero es cuando la actividad se cierra, el servicio sigue funcionando y cuando la actividad se abre de nuevo, puede volver a conectarse al servicio.

Debe utilizar startService() y stopService() lugar de (o posiblemente además de) bindService() y unbindService() .

Esto funcionó 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); } } 
  • No se puede iniciar el servicio Intent {cmp = com.marie.mainactivity / .BackgroundService}: no encontrado
  • ¿Existe un equivalente GCM de Android para el servicio de comentarios de emisión Push de iOS?
  • Appcelerator Android Service detiene las paradas
  • ¿Cómo mantener una conexión TCP establecida indefinidamente?
  • Uso de ResultReceiver en Android
  • ¿Por qué obtengo una InstantiationException si intento iniciar un servicio?
  • ¿Hay alguna forma de forzar a IntentService a no ser recreado?
  • Uso de Google Analytics en una aplicación de Android con una actividad de interfaz de usuario y un servicio de fondo sin fin
  • Enviar la emisión con la combinación de localbroadcastmanager sendorderedbroadcast
  • Cómo grabar vídeo desde el fondo de la aplicación: Android
  • Mi BroadcastReceiver no está recibiendo la intención BOOT_COMPLETED después de mis botas N1
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.