User Tag List

Resultados 1 al 11 de 11

Tema: Programacion android: UI+ Handler+ Bluetooth y como añadir otra activity ?¿

  1. #1

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts

    Programacion android: UI+ Handler+ Bluetooth y como añadir otra activity ?¿

    Buenas,

    El pesao vuelve de nuevo...

    Tengo una duda existencial (moriré si no sé como se hace)
    Tengo una app que tiene una activity principal que se usa para realizar una conexion bluetooth con otro dispositivo. Un handler para pasar mensajes entre esta Activity y el Bluetooth.
    Ahora necesito crear otra activity (SurfaceView) que cambie segun lo que se reciba del Bluetooth.

    Pregunta:¿Como puedo pasar el handler a la nueva activity para porder saber lo qeu me está llegando del Bluetooth?

    La pregunta es simple, no se si la respuesta tambien...

    Muchaa gracias por leer, y mas aun por contestar!

  2. #2

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,580
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,678
    Agradecer Thanks Received 
    1,933
    Thanked in
    Agradecido 1,295 veces en [ARG:2 UNDEFINED] posts
    ¿En el constructor de la activity?

    PD: yo soy de C++ y no tengo ni pajolera idea de Android.

  3. #3

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Sin más explicaciones de por medio...monta un Service, arráncalo y bindalo en el onCreate y pollealo cuando haga falta ¿?

    A las bravas te haces un handler singleton y ATPC.

    Cita Iniciado por swapd0 Ver mensaje
    ¿En el constructor de la activity?

    PD: yo soy de C++ y no tengo ni pajolera idea de Android.
    No se deben usar constructores en las activities en Android porque no siguen el lifecycle de un objeto normal, sino que mandas al SO un Intent de que las abra él como bien sepa (y le diga el manifest). Aunque pasas por el constructor, el punto de entrada de buena praxis es el método onCreate. La forma normal de mandarles cosas a las actividades es en un Bundle (mapa, diccionario) que viene con el Intent, pero el bundle no suele aceptar objetos que no sean serializables y dudo que su handler lo sea.

    EDIT: Si vas a usar SurfaceView asegúrate de activar OpenGL ES2, son un par de líneas de código, sube el rendimiento y sólo queda un 1% de teléfonos que no lo soporten. A menos que tu código sea GLES1, en cuyo caso lol.
    Última edición por pakoito; 20/01/2014 a las 22:55

  4. #4

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    Me gustaria tirar por lo del constructor, pero lo he intentado y no lo consigo.
    El problema que tengo es como crear la instancia desde la Activity principal, para que desde ella pueda acceder a sus metodos.

    Si en la activity principal lanzo la animacion con:
    Código:
    startActivity (new Intent (this, SurfaceViewAnimation.class));
    y la clase SufaceViewAnimation.java es la siguiente
    Código:
    class BouncingBallView extends SurfaceView implements SurfaceHolder.Callback {
    
            private BouncingBallAnimationThread bbThread = null;
    
            private int xPosition = getWidth()/2;
            private int yPosition = getHeight()/2;
            private int xDirection = 20;
            private int yDirection = 40;
    
            private static int radius = 20;
            private static int ballColor = Color.RED;
    
            public BouncingBallView(Context ctx, AttributeSet attrs, int defStyle) {
                    super(ctx, attrs, defStyle);
                    getHolder().addCallback(this);
            }
    
            public void onDraw(Canvas canvas) {
                    super.onDraw(canvas);
                    Paint paint = new Paint();
                    paint.setColor(Color.BLACK);
                    canvas.drawRect(0,0,getWidth(),getHeight(), paint);
                    paint.setColor(ballColor);
                    canvas.drawCircle(xPosition, yPosition, radius, paint);
            }
    
            public void surfaceCreated(SurfaceHolder holder) {
                    if (bbThread!=null) return;
                    bbThread = new BouncingBallAnimationThread(getHolder());
                    bbThread.start();
            }
            
            public void surfaceChanged(SurfaceHolder holder,int format, int width, int height) {  }
    
            public void surfaceDestroyed(SurfaceHolder holder) {
                    bbThread.stop = true;
            }
    
            private class BouncingBallAnimationThread extends Thread {
    
                    public boolean stop = false;
                    private SurfaceHolder surfaceHolder;
    
                    public BouncingBallAnimationThread(SurfaceHolder surfaceHolder) {
                            this.surfaceHolder = surfaceHolder;
                    }
    
                    public void run() {
                            while (!stop) {
                                    xPosition += xDirection;
                                    yPosition += yDirection;
                                    if (xPosition<0) {
                                            xDirection = -xDirection;
                                            xPosition = radius; }
                                    if (xPosition>getWidth()-radius) {
                                            xDirection = -xDirection;
                                            xPosition = getWidth()-radius; }
                                    if (yPosition<0) {
                                            yDirection = -yDirection;
                                            yPosition = radius; }
                                    if (yPosition>getHeight()-radius) {
                                            yDirection = -yDirection;
                                            yPosition = getHeight()-radius-1; }
    
                                    Canvas c = null;
                                    try {
                                            c = surfaceHolder.lockCanvas(null);
                                            synchronized (surfaceHolder) {
                                                    onDraw(c);
                                            }
                                    } finally {
                                            if (c != null) surfaceHolder.unlockCanvasAndPost(c);
                                    }
                            }
                    }
                    
            }
            
    		public boolean onTouchEvent(MotionEvent event) {
    			
    		   if (event.getAction() != MotionEvent.ACTION_DOWN) return false;		
    		   if (xDirection!=0 || yDirection!=0)		
    		         xDirection = yDirection = 0;		
    	       else {		
    	    	     xDirection = (int) event.getX() - xPosition;		
    	    	     yDirection = (int) event.getY() - yPosition;
    	       } 		
    		   return true;		
    		}
    		
    		public void setxDirection(int xDirection) {
    			this.xDirection = xDirection;
    		}
    		
    		public void setyDirection(int yDirection) {
    			this.yDirection = yDirection;
    		}
    		
    		public void setballColor(int ballColor) {
    			this.ballColor = ballColor;
    		}
    		
    		public void setradius(int radius) {
    			this.radius = radius;
    		}
    }
    
    public class SurfaceViewAnimation extends Activity {
            public void onCreate(Bundle savedInstanceState) {
                    super.onCreate(savedInstanceState);
                    setContentView(new BouncingBallView(this,null,0));
            }
    }
    ¿Como puedo crear la instancia de SufaceViewAnimation antes de hacer el startActivity(new Intent) para poder acceder a sus metodos y poder cambiar el color de ballColor, por ej.??
    Última edición por crossmax; 20/01/2014 a las 23:59

  5. #5

    Fecha de ingreso
    Sep 2006
    Ubicación
    Malaga
    Mensajes
    7,580
    Mencionado
    47 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    1,678
    Agradecer Thanks Received 
    1,933
    Thanked in
    Agradecido 1,295 veces en [ARG:2 UNDEFINED] posts
    Creo que seria mejor tener una clase para representar la pelota, podría tener un metodo render que le pasas un canvas para que se dibuje ahí y otro para la lógica (el rebote).

    Y después tienes una clase que herede de SurfaceView y esta tenga N objetos pelota (ok por ahora solo uno pero si mas adelante quieres poner mas yo lo veo mejor así) y los recorra para moverlos o dibujarlos.

    Última edición por swapd0; 21/01/2014 a las 00:24

  6. #6

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por pakoito Ver mensaje
    Sin más explicaciones de por medio...monta un Service, arráncalo y bindalo en el onCreate y pollealo cuando haga falta ¿?

    A las bravas te haces un handler singleton y ATPC.

    No se deben usar constructores en las activities en Android porque no siguen el lifecycle de un objeto normal, sino que mandas al SO un Intent de que las abra él como bien sepa (y le diga el manifest). Aunque pasas por el constructor, el punto de entrada de buena praxis es el método onCreate. La forma normal de mandarles cosas a las actividades es en un Bundle (mapa, diccionario) que viene con el Intent, pero el bundle no suele aceptar objetos que no sean serializables y dudo que su handler lo sea.

    EDIT: Si vas a usar SurfaceView asegúrate de activar OpenGL ES2, son un par de líneas de código, sube el rendimiento y sólo queda un 1% de teléfonos que no lo soporten. A menos que tu código sea GLES1, en cuyo caso lol.
    No es que te hubiera ignorado. Es que buscaba una solucion mas simple que hacer un Service aunque fuera mas chapucera. Y la verdad es que ni siquera sé si existía tal posibilidad, pero los constructores siempre dan mucho juego.
    Ahora veo que has explicado porque no usarlo en el constructor. Esta bien saberlo.

    Sin embargo estoy tan poco familiarizado con android que no se lo que es ATPC. Sobre el handler, tengo uno para intercambiar los mensajes que llegan/salen del bluetooth y que se muestran en la actividd principal, pero, ¿no puedo usarlo en la segunda activity (animacion) para saber lo que llega por bluetooth y cambiar valores de atributos de la animacion?

    Gracias por tomaros el tiempo en contestar

  7. #7

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Cita Iniciado por crossmax Ver mensaje
    No es que te hubiera ignorado. Es que buscaba una solucion mas simple que hacer un Service aunque fuera mas chapucera. Y la verdad es que ni siquera sé si existía tal posibilidad, pero los constructores siempre dan mucho juego.
    Ahora veo que has explicado porque no usarlo en el constructor. Esta bien saberlo.

    Sin embargo estoy tan poco familiarizado con android que no se lo que es ATPC. Sobre el handler, tengo uno para intercambiar los mensajes que llegan/salen del bluetooth y que se muestran en la actividd principal, pero, ¿no puedo usarlo en la segunda activity (animacion) para saber lo que llega por bluetooth y cambiar valores de atributos de la animacion?

    Gracias por tomaros el tiempo en contestar
    ATPC -> A Tomar Por Culo

    Las actividades no deben estar corriendo en el background, y menos mientras están leyendo de sensores. Para eso están los servicios. En todo caso, en vez de 2 Actividades deberías utilizar 1 Actividad con 2 Fragments y así no te saldrías de ella y podrías seguir utilizando el handler llamándolo desde los fragments con ((MiActividad)(getActivity())).getHandler(). Los fragments son como subactivities, pero no son tan estrictos en el lifecycle y te permiten usar cosas de una misma activity.

    O como dicen arriba, conceptualmente deberías cambiarlo un poco para no tener que andar mandándolo entre Activities. Create una clase Application, métela en el manifest, pon ahí un handler estático a tu clase que maneja el Bluetooth. Inicializa el handler en la primera actividad con los parámetros que te haga falta, y luego lo llamas desde la segunda.
    Última edición por pakoito; 21/01/2014 a las 10:39

  8. #8

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Entiendo que la App sólo tiene 1 "pantalla" que es ese SurfaceView verdad?
    Las Activities deben usarse sólo para gestionar la UI. Yo pondría lo del BT en otro thread (en background) o desde un servicio (si se va a usar por toda la app) y con el handler lo comunicaría con la activity que es donde tienes el SurfaceView.
    Te dejo aquí lecturas recomendadas.
    - Sobre el ciclo de vida de las activities lee esto. Mucho cuidado con iniciar cosas sólo en el onCreate, porque no siempre deberías iniciarlo ahí sino en el onResume, eso también va para pakoito. Recordad que estais en un teléfono y si entra por ejemplo una llamada, la app irá a background y al volver pasará por onResume no por onCreate. Si instanciais un objeto en el onCreate, luego podeis encontraros con NullPointerExceptions y similares precisamente por eso Hay bastante sobre el tema en la web de developer de android.
    - Echa un vistazo a este proyecto de ejemplo en el que usan servicios.
    - Aquí hay otra respuesta a cómo comunicar un servicio con una activity.

    Mi recomendación es que te mires la web de developer de android, al menos lo básico y después te pongas a pensar en cómo solucionar ese caso en concreto.

  9. #9

    Fecha de ingreso
    Jun 2004
    Ubicación
    Vivo en el pito foro...
    Mensajes
    20,686
    Mencionado
    70 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    230
    Agradecer Thanks Received 
    742
    Thanked in
    Agradecido 466 veces en [ARG:2 UNDEFINED] posts
    Entradas de blog
    28
    Y onCreateView para Fragments. Gracias por el recordatorio, Misato.

  10. #10

    Fecha de ingreso
    Sep 2005
    Ubicación
    Madri
    Mensajes
    438
    Mencionado
    1 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    13
    Agradecer Thanks Received 
    13
    Thanked in
    Agradecido 6 veces en [ARG:2 UNDEFINED] posts
    Cita Iniciado por ^MiSaTo^ Ver mensaje
    Entiendo que la App sólo tiene 1 "pantalla" que es ese SurfaceView verdad?
    Las Activities deben usarse sólo para gestionar la UI. Yo pondría lo del BT en otro thread (en background) o desde un servicio (si se va a usar por toda la app) y con el handler lo comunicaría con la activity que es donde tienes el SurfaceView.
    Te dejo aquí lecturas recomendadas.
    - Sobre el ciclo de vida de las activities lee esto. Mucho cuidado con iniciar cosas sólo en el onCreate, porque no siempre deberías iniciarlo ahí sino en el onResume, eso también va para pakoito. Recordad que estais en un teléfono y si entra por ejemplo una llamada, la app irá a background y al volver pasará por onResume no por onCreate. Si instanciais un objeto en el onCreate, luego podeis encontraros con NullPointerExceptions y similares precisamente por eso Hay bastante sobre el tema en la web de developer de android.
    - Echa un vistazo a este proyecto de ejemplo en el que usan servicios.
    - Aquí hay otra respuesta a cómo comunicar un servicio con una activity.

    Mi recomendación es que te mires la web de developer de android, al menos lo básico y después te pongas a pensar en cómo solucionar ese caso en concreto.
    Gracias misato por tus consejos. Siempre tan servicial y tan puesta en estos temas.

    Y gracias al resto, por supuesto!
    A ver si saco más tiempo y puedo verlo con tranquilidad, que se me ha atragantado un poco.

    Lo dicho, gracias!

    Enviado desde mi UMI X2 mediante Tapatalk

  11. #11

    Fecha de ingreso
    Feb 2004
    Ubicación
    Madrid
    Mensajes
    22,749
    Mencionado
    226 Post(s)
    Tagged
    0 Tema(s)
    Agradecer Thanks Given 
    2,240
    Agradecer Thanks Received 
    1,902
    Thanked in
    Agradecido 1,185 veces en [ARG:2 UNDEFINED] posts
    Sin problemas. Hace como año y medio que no hago nada para android así que estoy un poco desfasada pero sí te puedo ayudar con lo básico (o al menos intentarlo).

    Si nunca has hecho nada para móviles al principio puede parece un mundo nuevo, pero tranquilo que le coges el tranquillo rápido, ya verás

Etiquetas para este tema

Permisos de publicación

  • No puedes crear nuevos temas
  • No puedes responder temas
  • No puedes subir archivos adjuntos
  • No puedes editar tus mensajes
  •