2011-02-28 14 views
25

Soy nuevo en este android. Estoy usando un servicio para hacer un trabajo de fondo. así que estoy comenzando el servicio de mi actividad de la siguiente manera.Cómo iniciar el servicio en un nuevo hilo en Android

 getApplicationContext().bindService(
     new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class), 
     serviceConnection, 
     Context.BIND_AUTO_CREATE 
    ); 

pero el problema es que la actividad de Android está bloqueada. hasta el servicio,

  onServiceConnected(ComponentName className, IBinder service){ ..} 

se llama back.so he buscado con respecto a esto. Llegué a saber que tengo que comenzar mi servicio en un nuevo hilo. así que, por favor, cualquiera me ayude a hacer esto.

Respuesta

34

para crear e iniciar un nuevo hilo, desde el interior de una actividad, se puede decir:

Thread t = new Thread(){ 
public void run(){ 
getApplicationContext().bindService(
     new Intent(getApplicationContext(), MyAndroidUpnpServiceImpl.class), 
     serviceConnection, 
     Context.BIND_AUTO_CREATE 
    ); 
} 
}; 
t.start(); 

Además, almacenar en caché el valor devuelto por bindservice, en su caso, si lo requiere para su uso posterior.

+0

Gracias Samuh i se mira esto ... – bHaRaTh

+1

hi Samuh su trabajo. ahora no está bloqueando mi actividad hasta que se inicie el servicio ... muchas gracias por su ayuda ... y tengo una pregunta más.lo ubicaré en el siguiente comentario. – bHaRaTh

+0

una vez que vinculamos el servicio de la primera actividad y hacemos uso de ese servicio, lo desvinculará. así que supongamos en mi próxima actividad si queremos utilizar el mismo servicio, ya sea que tengamos que volver a vincularlo allí correctamente, o si estoy equivocado en el proceso. – bHaRaTh

1

si alguien está leyendo esto está buscando una solución que implique mantener la secuencia de la interfaz de usuario en una ejecución fluida, es mejor que revise AsyncTask tarea . aplausos.

+4

AsyncTask no será útil cuando tenga código para ejecutar sin iniciar una aplicación. – Erol

+0

Estoy hablando de mantener el hilo de la IU libre, no veo la conexión con lo que ha dicho ... por cierto, un servicio es parte de la aplicación, todos funcionan bajo el mismo proceso. tal vez te refieres a ejecutar el código fuera de la actividad? – gor

14

Cualquier solución que utilice Threads, Runnables, AsyncTask o de otro modo con un servicio tendrá un problema común .

El Servicio bloqueará la Actividad de llamada hasta que se haya iniciado el servicio. Y, por lo tanto, no encadena eficazmente el Servicio en ciertos casos.

La solución a esto es utilizar la subclase IntentService.

Ejemplo de cómo implementar:

public class MyCustomService extends IntentService 
{ 
    private DatabaseAdapter mAdapter; 

    public MyCustomService() { 
     super("MyCustomService"); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) 
    { 
     super.onStartCommand(intent, flags, startId); 
     Toast.makeText(this, "MyCustomService Started", Toast.LENGTH_LONG).show(); 

     // Don't let this service restart automatically if it has been stopped by the OS. 
     return START_NOT_STICKY; 
    } 

    @Override 
    protected void onHandleIntent(Intent intent) 
    { 
     Toast.makeText(this, "MyCustomService Handling Intent", Toast.LENGTH_LONG).show(); 
     // INSERT THE WORK TO BE DONE HERE 
    } 
} 

onCreate() y OnDestroy también se pueden overriden tanto tiempo como super.onWhatever() se llama dentro de ellos.

+2

No puede hacer todas las cosas con IntentService. El servicio tiene su propio uso. – Saty

3

Pregunta anterior, pero estoy respondiendo porque alguien me llamó la atención en otra pregunta.

El problema del OP fue evidentemente causado por el servicio onBind(...) que demoró mucho tiempo y bloqueó el hilo principal. La solución correcta es , no hagas eso. El servicio debe rediseñarse para que el onBind(...) regrese rápidamente. Como casi todo lo demás en la API de Android, siempre debe llamar al bindService(...) en el hilo principal.

La razón es que la seguridad de subprocesos en Java no es solo una cuestión de atomicidad, sino también visibility. (Desplácese hacia abajo a la sección de visibilidad). En general, siempre debe suponer que cada API de Java es no protegida contra subprocesos a menos que esté explícitamente documentado de lo contrario.

1

Recomendaría usar un servicio de intendencia, porque un servicio de intención se ejecuta por defecto en un hilo separado. Pero aún si la clase de servicio se extiende servicio a continuación, utilizar este código:

Thread thread = new Thread() { 
    @Override 
    public void run() { 
     startService(new Intent(getApplicationContext(), YourService.class)); 
    } 
}; 
thread.start(); 
Cuestiones relacionadas