Foros       Consigue tu camiseta aquí
Comunicacion entre Service y Activity
Ir a página 1, 2  Siguiente
 
Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.Android-Spa.com -> Problemas programando en Android
Mostrar mensajes anteriores:   

dabit_1

Mensajes: 5
MensajePublicado: Mie May 27, 2009 2:03 pm    Título del mensaje: Comunicacion entre Service y Activity Enviar mensaje privado Responder citando

Necesito enviar información desde un servicio a una activity. No logro encontrar información ni ejemplos por ningun sitio, ni tan siquiera en ingles. Porfavor alguien sabe algo????

JaVaK

Mensajes: 5351
MensajePublicado: Mie May 27, 2009 2:08 pm    Título del mensaje: Enviar mensaje privado Responder citando

Bienvenido dabit_1, no sé si será igual pero en un manual que hay sobre un Widget hay comunicación servicio-Widget, que se podría cambiar a servicio-Activity porque viene a ser lo mismo.

Míratelo por si te vale: http://www.android-spa.com/viewtopic.php?t=2416

dabit_1

Mensajes: 5
MensajePublicado: Mie May 27, 2009 2:47 pm    Título del mensaje: Enviar mensaje privado Responder citando

Muchas gracias por la rapida respuesta, he estado mirando el codigo y veo cosas que con una activity no se pueden hacer, tp me aclaro muy bien con el codigo la verdad... si alguien supiera ponerme un ejemplo senzillo de paso de variables entre service y activity, gracias!

javiel

Mensajes: 360
MensajePublicado: Mie May 27, 2009 2:58 pm    Título del mensaje: ... Enviar mensaje privado Responder citando

Que cosas, yo estoy mirando eso ahora exactamente

Estoy intentando crear un ejemplo sencillo pero está casi todo pero cuando actualizo una caja de texto por ejemplo, no me la actualiza

Este tuto te explica como hacerlo

http://developerlife.com/tutorials/?p=356

Pero como te digo, en el updateUI le pongo un setText() a un TextView y no me lo hace, aunque si puedo escribir en el log

¿hay alguna forma de refrescar un activity?

Sólo me queda eso, tengo el ejemplo casi terminado a falta de eso

Tengo prisas luego pongo el código

dabit_1

Mensajes: 5
MensajePublicado: Mie May 27, 2009 3:01 pm    Título del mensaje: Enviar mensaje privado Responder citando

Gracias javiel, voy a mirarme el ejemplo y a ver si consigo algo!

Lu

Mensajes: 449
MensajePublicado: Mie May 27, 2009 4:35 pm    Título del mensaje: Enviar mensaje privado Responder citando

Hola,

No sé si aun os hace falta info sobre esto, pero hace unas semanas a mí me pasó igual. Os dejo el link del hilo porque al final explico como lo solucioné yo (para lo que yo necesitaba, que no sé si será lo mismo que lo que necesitais vosotros, o aunque no sea lo mismo igual lo podéis hacer así tambien).

http://www.android-spa.com/viewtopic.php?t=1790

Saludos Smile

dabit_1

Mensajes: 5
MensajePublicado: Mie May 27, 2009 5:14 pm    Título del mensaje: Enviar mensaje privado Responder citando

Muchas gracias Lu! parece lo que quiero, solo me queda una duda, en la clase Service que metodo es ejecutado al inicio? pruebo con onCreate y no se si es q lo escribo mal pero no me hace nada

javiel

Mensajes: 360
MensajePublicado: Mie May 27, 2009 5:17 pm    Título del mensaje: ... Enviar mensaje privado Responder citando

Lu, estoy muy interesado en saber como lo haces, lo he leido pero no lo entiendo

De principio usas un BroadcastReceiver, que supongo que será una especie de recector, pero lo que no me queda claro es como envias información desde el servicio a la actividad.

Veo que es con esto:

Código :

Intent i = new Intent(Intent.ACTION_VIEW);            
this.sendOrderedBroadcast(i, null);
 


Lo que no sé es como le envías información ¿desde un Intend? Porque usas Intent.ACTION_VIEW, estoy muy perdido.

Si por ejemplo yo quisiera pasar la localización del GPS (que es lo que me interesa) ¿como lo haría?

De principio pongo aquí el código que prometí, aunque estoy muy interesando que como lo haces tu Lu

PROGRAMA

Lo que hace es tener un contador que se actualiza cada segundo desde un servicio

PROBLEMA

Desde el update(int count) de la actividad no actualiza el TextView y ni muestra el Toast. Pero fijaros que si escribe en la consola

CODIGO

MyService.java

Código :

package com.javielinux.pruebaservicio;

import java.util.Timer;
import java.util.TimerTask;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;

public class MyService extends Service {

    private Timer timer = new Timer();
    private static final long UPDATE_INTERVAL = 1000;
    public static ServiceUpdateUIListener UI_UPDATE_LISTENER;
   
    private int count = 0;
   
    public static void setUpdateListener(ServiceUpdateUIListener l) {
        UI_UPDATE_LISTENER = l;
    }
   
    @Override
    public IBinder onBind(Intent arg0) {
        return null;
    }
   
    @Override
    public void onCreate() {
        super.onCreate();
        _startService();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        _shutdownService();
    }
   
    private void _startService() {
        timer.scheduleAtFixedRate(
            new TimerTask() {
                public void run() {
                    count++;
                    System.out.println("_startService(): " + count);
                    UI_UPDATE_LISTENER.update(count);
                }
            },
            0,
            UPDATE_INTERVAL);
    }
   
    private void _shutdownService() {
        if (timer != null) timer.cancel();
    }

}

 


ServiceUpdateUIListener.java

Código :

package com.javielinux.pruebaservicio;

public interface ServiceUpdateUIListener {
    public void update(int count);
}

 


PruebaServicio.java (la actividad)

Código :

package com.javielinux.pruebaservicio;

import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.widget.Toast;

public class PruebaServicio extends Activity implements ServiceUpdateUIListener {
   
    TextView text;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
       
        text = (TextView) findViewById(R.id.count);
        text.setText("...");
       
        Toast.makeText(this, "Empezando..." , Toast.LENGTH_SHORT).show();
       
        Button startButton = (Button) findViewById(R.id.start);
       
        startButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                startService();
            }
         
        });
       
        Button stopButton = (Button) findViewById(R.id.stop);
       
        stopButton.setOnClickListener(new View.OnClickListener() {

            public void onClick(View view) {
                stopService();
            }
         
        });
       
        MyService.setUpdateListener(this);
       
       
    }
   
    private void startService() {
        Intent svc = new Intent(this, MyService.class);
        startService(svc);
    }
   
    private void stopService() {
        Intent svc = new Intent(this, MyService.class);
        stopService(svc);
    }
   

    @Override
    public void update(int count) {
        System.out.println("update(): " + count);
        Toast.makeText(this, "Contadores: " + count, Toast.LENGTH_SHORT).show();
        text.setText("Contador: " + count);
    }
   
}
 


main.xml (layout)

Código :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    >
<TextView  
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:text="Contador:"
    android:layout_marginTop="20px"
    android:layout_marginBottom="20px"
    android:id="@+id/count"
    />
<Button android:text="Arrancar servicio" android:id="@+id/start" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
<Button android:text="Parar servicio" android:id="@+id/stop" android:layout_width="wrap_content" android:layout_height="wrap_content"></Button>
</LinearLayout>

 

javiel

Mensajes: 360
MensajePublicado: Mie May 27, 2009 5:19 pm    Título del mensaje: ... Enviar mensaje privado Responder citando

recordad que servicio tiene que estar en el Manifest

<service android:name="MyService"></service>

Lu

Mensajes: 449
MensajePublicado: Mie May 27, 2009 5:27 pm    Título del mensaje: Enviar mensaje privado Responder citando

dabit_1 escribió:
Muchas gracias Lu! parece lo que quiero, solo me queda una duda, en la clase Service que metodo es ejecutado al inicio? pruebo con onCreate y no se si es q lo escribo mal pero no me hace nada


De nada. Sí es con onCreate, pero un servicio no se inicia solo, tienes que iniciarlo desde una actividad con el método startService. Te voy a postear mi código para que te sea mas facil, que a mi me costó bastante pillarlo.

Esto lo tengo en el AndroidManifest:


Código :
<service android:name=".sync.SyncService">
            <intent-filter>
                <action android:name="com.myProject.MY_SERVICE" />
            </intent-filter>       
        </service>



Eso por un lado. Por otro lado esto lo tengo puesto en la actividad que lanza el servicio:

Código :
Intent serviceIntent = new Intent();
        serviceIntent.setAction("com.myProject.MY_SERVICE");
        startService(serviceIntent);


Y luego ya en otra clase aparte tengo la clase del servicio, que extiende de Service con los métodos onCreate y onDestroy.

Espero haberte ayudado. Saludos Smile

Lu

Mensajes: 449
MensajePublicado: Mie May 27, 2009 5:33 pm    Título del mensaje: Enviar mensaje privado Responder citando

EStoy mirando tu post Javiel...dame unos minutos que lo entienda bien, jeje Smile

Lu

Mensajes: 449
MensajePublicado: Mie May 27, 2009 5:53 pm    Título del mensaje: Enviar mensaje privado Responder citando

A ver, creo que lo que quieres es pasarle la variable "count" desde el servicio a la activity. Ahora mismo en el código que has posteado no veo que se la pases en ningún sitio y por eso no se te actualiza.

Nuestros problemas son un poco distintos. Mi servicio lo que hacia era cada X tiempo hacía una peticion a unos web services y al terminar la llamada "avisaba" a la activity. Yo no le pasaba ningún dato. Como bien has dicho, el broadcastReceiver es como un receptor, y cuando el service llamaba al método sendOrderedBroadCast, la actividad recoge ese aviso del service. No entiendo mucho de intents, pero cuando puse lo de Intent.ACTION_VIEW es como un filtro. En la actividad registré el receiver asi: this.registerReceiver(receiver, new IntentFilter(Intent.ACTION_VIEW)); El servicio manda el aviso con la accion Intent.ACTION_VIEW y si coincide con el filtro de la actividad, pues ésta recoge el mensaje (sino no). Ten en cuenta tambien que la actividad debe estar en su ciclo activo para enterarse de que le ha llegado un mensaje.

Como te he dicho, no tuve que pasar ningún dato y no soy experta en intents, pero supongo que dentro del intent podrás meter el dato (con un bundle o algo asi no?) y en el listener del BroadcastReceiver fijate que puedes recuperar el intent y entonces supongo que podrás sacar el dato de ahí para entonces poder mostrarlo en la activity.

Se que me explico fatal, espero haberme hecho entender. Ya te digo que lo de pasar datos yo no lo hice, pero supongo que se haría así. Si tienes mas preguntas con algo dimelo, que ya te digo que me explico fatal. Espero que te sirva.

Saludos Smile

javiel

Mensajes: 360
MensajePublicado: Mie May 27, 2009 6:19 pm    Título del mensaje: .... Enviar mensaje privado Responder citando

te has explicado perfectamente

Pensaba que estabas enviando un dato o algo. En el Intend se puede usar un Bundle como dices para enviar datos de un lado a otro.

Muchas gracias por la explicación, me queda claro ya de que va todo esto Wink

El código que he enviado funciona y le paso la variable "count", lo que pasa es que no actualiza la pantalla (no se ni porque)

Fijate como se crea una "interface" y desde el _startService() se llama a UI_UPDATE_LISTENER.update(count);

UI_UPDATE_LISTENER es el listener que se establece en la actividad y que yo tengo puesta como la propia actividad. Lo hago estableciendo una variable estática así

Código :
MyService.setUpdateListener(this);


Luego al llamar desde el _startService llama al método update de la actividad. El programa funciona, y escribe en la consola cada segundo, pero no actualiza la pantalla (parece que es como si no se enterara que tiene que actualizar la pantalla)

Lo estoy probando haciendo uso del GPS y de principio me ha funcionado y lo hace como quiero

Voy a probarloa a la calle Wink

saludos y gracias

Lu

Mensajes: 449
MensajePublicado: Mie May 27, 2009 6:31 pm    Título del mensaje: Enviar mensaje privado Responder citando

Ahm vale, ya lo veo mejor, es importante esa linea, jejeje. Al final voy a salir aprendiendo yo más que nadie, no se me había ocurrido nunca hacerlo así. Claro, cuando llamas al update desde el service, estas llamando al update de la propia Activity. Pues si que es raro que no se te refresque la pantalla...

Bueno, que vaya bien la prueba al aire libre, jeje.

Saludos Smile

dabit_1

Mensajes: 5
MensajePublicado: Mie May 27, 2009 7:23 pm    Título del mensaje: Enviar mensaje privado Responder citando

Muchas gracias a todos, gracias a vosotros ya e conseguido pasar la inforamcion, ahora el problema q tengo es que parece que el stopService no me hace ni caso, hago un:
this.stopService(servei)

donde "servei" es el Intent instanciado asi:

servei = new Intent(this, Servei.class);


alguna idea de pq no se detiene????

Publicar Nuevo Tema   Responder al Tema    Índice del Foro www.Android-Spa.com -> Problemas programando en Android Todas las horas están en GMT + 2 Horas
Ir a página 1, 2  Siguiente
Página 1 de 2
Ver tema anterior :: Ver siguiente tema  

 
Saltar a:  
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas