Ver la versión completa : Programacion android: UI+ Handler+ Bluetooth y como añadir otra activity ?¿
crossmax
20/01/2014, 18:42
Buenas,
El pesao vuelve de nuevo...
Tengo una duda existencial (moriré si no sé como se hace) [Ahhh]
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!
¿En el constructor de la activity?
PD: yo soy de C++ y no tengo ni pajolera idea de Android.
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.
¿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.
crossmax
20/01/2014, 23:44
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:
startActivity (new Intent (this, SurfaceViewAnimation.class));
y la clase SufaceViewAnimation.java es la siguiente
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.??
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.
crossmax
21/01/2014, 01:19
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
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 :p
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.
^MiSaTo^
21/01/2014, 10:59
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 (http://developer.android.com/training/basics/activity-lifecycle/index.html). 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 (http://developer.android.com/reference/android/app/Service.html#LocalServiceSample) en el que usan servicios.
- Aquí (http://stackoverflow.com/questions/2463175/how-to-have-android-service-communicate-with-activity)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 (http://developer.android.com/training/index.html), al menos lo básico y después te pongas a pensar en cómo solucionar ese caso en concreto.
Y onCreateView para Fragments. Gracias por el recordatorio, Misato.
crossmax
21/01/2014, 21:38
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 (http://developer.android.com/training/basics/activity-lifecycle/index.html). 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 (http://developer.android.com/reference/android/app/Service.html#LocalServiceSample) en el que usan servicios.
- Aquí (http://stackoverflow.com/questions/2463175/how-to-have-android-service-communicate-with-activity)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 (http://developer.android.com/training/index.html), 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
^MiSaTo^
21/01/2014, 23:19
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 :brindis:
Powered by vBulletin® Version 4.2.5 Copyright © 2025 vBulletin Solutions Inc. All rights reserved.