Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Desarrollo en Delphi para Android (https://www.clubdelphi.com/foros/forumdisplay.php?f=57)
-   -   Aplicación se reinicia al traerla a primer plano (https://www.clubdelphi.com/foros/showthread.php?t=92099)

jhonalone 24-07-2017 19:32:14

Aplicación se reinicia al traerla a primer plano
 
Hola a todos de nuevo.
Los enanos del circo de Delphi siguen creciendo.
En la versión 6.0.1 de android, no basta con que TMemo se haya vuelto literalmente LOCO, según lo que vemos en este hilo.

(Perdón por no haber iniciado un nuevo hilo con este tema y haber usado otro ya abierto.)

Acabo de observar una nueva DESGRACIA? para los programas android generados con Delphi.

A ver si sé explicarme:
Los dispositivos Samsung (son los que yo utilizo) disponen de un botón que está por debajo de la pantalla y en el centro del dispositivo. Sirve para activar el terminal si se ha desactivado (apagado la pantalla) cuando llevas un tiempo sin usarlo. Esto está muy bien para prolongar la duración de la batería.

En otro hilo anterior, ya expliqué los problemas que habían surgido con la versión 6.0.1 de android.
Pues había cambiado la funcionalidad, tanto de este botón central como del sensor de dos rallitas dentro de un cuadrado que está a la izquierda de dicho botón.

Bueno, pues el nuevo INCONVENIENTE, que he observado consiste en esto:
En versiones anteriores y en ésta (6.0.1 que, acertadamente, le han puesto el nombre de Marshmallow. Y efectivamente es "mucho márs malou") (perdón por el chiste porque no tiene ninguna gracia) digo que en las versiones anteriores y en ésta cuando pulsas brevemente este botón central, ocultas el programa que estás utilizando, para poder hacer una llamada o cualquier otra cosa.

En versiones anteriores, cuando volvías a pulsar de nuevo este botón te aparecían en pantalla los programas que tenías abiertos. Si pulsabas brevemente sobre cualquiera, volvías a retomar el programa en la situación que lo dejaste (incluídos los generados por Delphi).

En la versión a la que no estamos refiriendo, si pulsas el botón central te aparece Google. Para que aparezcan los programas que estaban "minimizados" tienes que pulsar en el sensor a la izquierda del botón central, (que ahora se representa por dos rectángulos superpuestos, simulando lo que representa: ventanas en cascada).

Bueno, pues aparecen todos los programas que tienes minimizados en una cascada de ventanas.

Y aquí está el problema:

Si seleccionas cualquier aplicación que no haya sido generada con Delphi, la retomas donde la dejaste.

Pero si eliges una que ha sido generada por Delphi... ¡¡SORPRESA!! La aplicación se reinicia y arranca desde el principio, como si la hubieras llamado pulsando su icono.

Perdón por haberme alargado tanto, pero no sabía explicarlo mejor. Si aún no se entiende, lo siento.

Como siempre, solicito alguna ayuda (si es posible).

Gracias por leerme y saludos a todos.

dec 24-07-2017 20:04:05

Hola a todos,

Creo que lo que describes no es un problema de Delphi, sino que, se trata del comportamiento del sistema operativo, del "ciclo de vida" de las aplicaciones en Android. En efecto, cuando una aplicación se pone en segundo plano (pasamos a hacer otra cosa con otra aplicación), es el sistema el encargado de decidir si dicha aplicación va a cerrarse o mantenerse en segundo plano, etc. Dependiendo, supongo, de no pocas variables: necesidades de la aplicación, consumo de memoria RAM, batería restante, etc., etc.

Por ejemplo, en una aplicación que estoy desarrollando actualmente, usamos un componente "Websocket", que, permanece conectado a un determinado servidor. Pues bien, desde que usamos dicho componente, he podido notar que nuestra aplicación prácticamente no se "reinicia" como tú describes, sino que puede pasar de un segundo a un primer plano "sin más". Yo achaco este comportamiento a que Android sabe que ahí hay un Websocket abierto, y que, este debería permanecer conectado el mayor tiempo posible.

Sin embargo, hay veces que aún así la aplicación se comporta exactamente como describes, pero, como digo, no es algo anormal, sino el "ciclo de vida" de las aplicaciones de Android. En Delphi debe haber eventos como "OnBackground" y "OnResume", que, nos permitan mantenernos al tanto del ciclo de vida de la aplicación: saber si esta pasa a segundo plano, si vuelve a ponerse en primer plano, etc. Atendiendo a estos eventos podremos estar preparados para "resumir" en condiciones nuestra aplicación.

Es decir, no importa si esta se "reinicia", si nosotros sabemos que "venimos" de un "segundo plano", podemos antes (cuando pasamos a dicho segundo plano) haber guardado ciertos datos, por ejemplo, posbiles campos de un formulario ya rellenados, de modo que podamos situar al usuario en la vista o formulario de la aplicación que corresponda, e, incluso rellenar "los campos" del supuesto formulario, de modo que el usuario no pierda dicha información y todo "fluya" más o menos como se espera.

En conclusión: infórmate acerca del "ciclo de vida" de las aplicaciones de Android y de cómo manejar este tipo de situaciones usando Delphi: qué eventos podemos usar, etc.

jhonalone 24-07-2017 20:40:50

Muchas gracias dec.
La verdad es que es un fastidio. Y esto ocurre en la versión 6.0.1 (tal vez también en las siguientes)

Tendré que investigar a ver si puedo evitarlo.

Se que Delphi tiene la posibilidad de hacerlo con el evento onSaveState, pero no lo he utilizado nunca y no sé como resultará.

Con el tema de los "ciclos de vida" también investigaré. Mientras tanto, si alguien lo tiene solucionado, agradecería cualquier ayuda.

El WhatsApp, por ejemplo, no se reinicia. Seguiré investigando.

Saludos.

Casimiro Notevi 24-07-2017 21:17:45

Es lo que dice dec, es el "ciclo de vida" de los programas android. Es algo que debes controlarlo tú.





dec 24-07-2017 22:15:09

Hola a todos,

Si no me equivoco, Whatsapp, utiliza un "servicio", o sea, no una aplicación "normal y corriente", para mantener la aplicación "activa". Pero tampoco estoy seguro de esto. Tal vez, por la propia característica de la aplicación, Android no la "termine" como puede terminar otras que considere oportuno. Como he dicho arriba, antes de usar un "Websocket" en cierta aplicación, yo notaba que los "reinicios" de esta eran mayores que después de usar dicho componente. Es como si Android supiese que hay un Websocket abierto (de hecho lo sabrá), de modo que, no es que garantize que la aplicación no se "cerrará", pero, digamos que no lo hace con la misma asiduidad que con otras aplicaciones. O sea, en todo caso es algo con lo que hay que convivir y tratar de lidiar con ello, dependiendo de las propias aplicaciones que se lleven a cabo.

jhonalone 24-07-2017 23:04:23

Gracias, Casimiro;

Me han quedado algunas cosas claras:
1.- Que Android (antes no, ahora si) en las nuevas versiones, elimina las aplicaciones en segundo plano que (con sus criterios) no interesan a sus fines.

2.- Que no sabemos los criterios que utiliza para eliminarlas.

3.- Que debe haber una forma e evitarlo, que no conocemos.

4.- Que, tal y como dice dec, es posible que el componente "Websocket" esté incluído en sus criterios.

5.- Que la calculadora no se borra. Vamos conserva los datos después de volverla a primer plano.

6.- Que el programa reloj conserva también los datos.

7.- Otro ejemplo: he bajado de play store, para probar, un programa llamado Crucigramas que también conserva los datos.

Creo que de haber una forma de evitarlo y creo que no debe ser tan complicada como onSaveState.

Gracias por vuestro interés.

Saludos cordiales.

kurono 25-07-2017 01:46:54

amigo jhonalone algunas versiones de android tiene las opcion de aumentar el numero de aplicaciones que se puede tener en segundo plano verifica si tu terminal tiene esas opcionees

y para dec quisiera saber si el componente Websocket es un componente nativo o de tercero pues me llego la idea de incluirlo en las aplicaciones lo use o no ya que has dicho que las aplicaciones duran mas para cerrar

dec 25-07-2017 11:55:34

Hola a todos,

Cita:

Empezado por jhonalone (Mensaje 519656)
Gracias, Casimiro;

Me han quedado algunas cosas claras:
1.- Que Android (antes no, ahora si) en las nuevas versiones, elimina las aplicaciones en segundo plano que (con sus criterios) no interesan a sus fines.

Hombre, no es tanto que no interese a los fines de Android: lo que el sistema operativo hace es tratar de optimizar, entre otras cosas, el uso de la batería. Debe haber otras razones (optimizar el uso del procesador, "sensores", etc.) pero la batería es una de las más importantes: aplicaciones que estuviesen siempre activas consumirían recursos acaso innecesarios. Lo que el sistema trata de determinar es qué aplicación requiere permanecer activa, por cuánto tiempo, etc., etc.

Cita:

Empezado por jhonalone (Mensaje 519656)
2.- Que no sabemos los criterios que utiliza para eliminarlas.

Yo creo que esto debe estar documentado en algún lado. Si bien no todos los criterios pormenorizados, al menos un detalle de los mismos, así como indicaciones para los desarrolladores. Lamento no poder enlazar a ningún sitio ahora mismo, pero, creo yo que debe ser así.

Cita:

Empezado por jhonalone (Mensaje 519656)
3.- Que debe haber una forma e evitarlo, que no conocemos.

No se trata de evitarlo: es el "ciclo de vida" de las aplicaciones, es algo que se hace para mejorar la experiencia del usuario, para que la batería no dure "un suspiro", por ejemplo, sino que dure lo máximo posible. Por eso no se trata de evitarlo, sino de lidiar con ello, de tenerlo en cuenta. Por ejemplo, respondiendo a un mensaje tuyo en otro hilo, no es que debamos o sea menester guardar el estado de toda nuestra aplicación, y, después recuperar dicho estado "completamente". Esto, seguramente, no tiene sentido.

Más bien hemos de ponernos en el caso de que un usuario esté rellenando algún formulario de nuestra aplicación, y, de repente, pase a otra aplicación, por ejemplo, porque le llaman por teléfono. Lo que acaso debemos guardar nosotros (si lo consideramos necesario, y, por favorecer al usuario) son los datos del formulario en cuestión, lo que ya hubiese escrito el usuario, de modo que, cuando vuelva a reactivar la aplicación, si es necesario (si se desactivó antes) volver a rellenar los datos del formulario, para que el usuario no tenga que escribirlos de nuevo.

Pero no se trata de guardar más allá de eso... claro que dependerá de la aplicación, pero, lo que quiero decir es que no se trata de guardar "todo" lo de nuestra aplicación, para recuperarlo después. Nuestra aplicación tendrá un "ciclo de vida", que debemos controlar, pero, no hay que llegar a esos extremos. Un juego, por ejemplo, podrá guardar la partida en curso, si se quiere, pero, no necesitará ir más allá... podrá dar al usuario la opción de lanzar de nuevo la partida "cortada", o bien hacerlo de forma automática, pero, no tiene porqué haber guardado nada más que eso.

Cita:

Empezado por jhonalone (Mensaje 519656)
4.- Que, tal y como dice dec, es posible que el componente "Websocket" esté incluído en sus criterios.

No es tanto el componente Websocket, sino la conexión que se establece a través de dicho componente. Tengo que decir que yo hablo de una aplicación en la que no uso Delphi... de modo que lo del Websocket lo dije a modo de ejemplo. En efecto, este componente permite establecer, y, más importante para lo que nos ocupa, mantener una conexión abierta con un servidor. En efecto, esto puede "descubrirse", el sistema lo sabe, y, por lo tanto da un poco más de coba a nuestra aplicación, por decirlo así.

Cita:

Empezado por jhonalone (Mensaje 519656)
5.- Que la calculadora no se borra. Vamos conserva los datos después de volverla a primer plano.

Puede que los recupere: esto se puede hacer de forma transparente al usuario. No sé exactamente en el caso de la calculadora, pero, después de que nuestra aplicación se "reinicie" podemos llevar al usuario a la vista o formulario en que estuviese antes, rellener los datos de un posible formulario, etc. Todo transparente para el usuario.

Cita:

Empezado por jhonalone (Mensaje 519656)
6.- Que el programa reloj conserva también los datos.

Tampoco sé muy bien si estas aplicaciones que acompañan al sistema operativo tienen ya algún tipo de "prioridad" especial, o, tal vez, acaso, que su "reinicio" no sea exactamente igual que en el caso de las aplicaciones Delphi, es decir, que, aunque se reinicien, el proceso es aún más transparente: no se muestra una posible "splash screen" de nuevo, etc. De modo que a nosotros nos parece que estas aplicaciones están funcionando en "background", pero, en realidad no sea así.

Por ejemplo, en el caso de la aplicación que desarrollo, los "reinicios" son bastante claros: porque se muestra una "splash screen". Pero esto es algo que tiene que ver con esta aplicación en concreto y con el entorno de desarrollo empleado, etc. Tal vez la calculadora y el reloj se reinicien igualmente, pero, "no se note", como si mostrasen un "splash screen" cada vez que se inician "desde cero".

Cita:

Empezado por jhonalone (Mensaje 519656)
7.- Otro ejemplo: he bajado de play store, para probar, un programa llamado Crucigramas que también conserva los datos.

Si hablamos de un programa de terceros y este conserva sus datos, podemos estar seguros de que el autor de dicha aplicación recupera dichos datos y los vuelve a mostrar. Insisto una vez más: no se trata de evitar que nuestra aplicación no se reinicie o no se ponga en segundo plano: esto es contraproducente para el mismo usuario y la batería del dispositivo, sin ir más lejos, se trata de adaptarse a lo que en Android se llama "el ciclo de vida" de las aplicaciones. No evitarlo, sino trabajar con ello.

Cita:

Empezado por jhonalone (Mensaje 519656)
Creo que de haber una forma de evitarlo y creo que no debe ser tan complicada como onSaveState.

Es que si pretendes guardar TODO el estado de tu aplicación... en efecto, tal vez sea una tarea que aparece a bote pronto complicada. Pero no es tanto lo que hay que guardar, estoy seguro. O no se trata de guardarlo todo... a no ser que la aplicación en cuestión lo requiera, cosa que sería "rara" y particular de dicha aplicación en todo caso.

Cita:

Empezado por kurono (Mensaje 519659)
amigo jhonalone algunas versiones de android tiene las opcion de aumentar el numero de aplicaciones que se puede tener en segundo plano verifica si tu terminal tiene esas opcionees

y para dec quisiera saber si el componente Websocket es un componente nativo o de tercero pues me llego la idea de incluirlo en las aplicaciones lo use o no ya que has dicho que las aplicaciones duran mas para cerrar

Como le he comentado al compañero arriba, hablo de una aplicación que no se desarrolla con Delphi, pero, el concepto sería el mismo: si abrimos y mantenemos abierta una conexión con un servidor, según mi experiencia (y nada más, ojo...) Android "respeta" un poco más la aplicación, justamente, porque hay una conexión establecida con el servidor: que no es algo que desde luego todas las aplicaciones necesiten.

Casimiro Notevi 25-07-2017 12:18:58

Tal y como dice dec, y el dibujito que he puesto antes, el ciclo de vida de una aplicación android NO es como una de windows. Cuando sales del programa (o se "duerme") debes programar lo que necesites en los "eventos" activity_pause y activity_resume.

jhonalone 25-07-2017 13:24:36

1 Archivos Adjunto(s)
Gracias a todos por vuestro interés, vuestro tiempo y vuestro esfuerzo.

Después de buscar y rebuscar, trastear y trastear con el móvil parece que la solución es bastante sencilla.

Se trata de desactivar la opción de "No mantener actividades", tal y como puede verse en la imagen adjunta.

Espero os sirva a todos.

Saludos a todos.

dec 25-07-2017 13:29:55

Hola a todos,

Cita:

Empezado por jhonalone (Mensaje 519678)
Gracias a todos por vuestro interés, vuestro tiempo y vuestro esfuerzo.

Después de buscar y rebuscar, trastear y trastear con el móvil parece que la solución es bastante sencilla.

Se trata de desactivar la opción de "No mantener actividades", tal y como puede verse en la imagen adjunta.

Espero os sirva a todos.

Saludos a todos.

Pero esa es una "opción de desarrollador": normalmente, los usuarios no tendrán dichas opciones disponibles, ni nosotros deberíamos contar conque las tuviesen acaso.

jhonalone 25-07-2017 13:41:45

Bueno, dec, siempre será mejor algo que nada.

Como mucho se le puede pedir al usuario que la active.

Ah! por cierto, es una solución parcial, pues estoy comprobando, que cuando recuperas la App al poco tiempo, la mantiene intacta, pero (y esto lo sospecho, no estoy seguro) cuando pasa el tiempo seleccionado para la desactivación de la pantalla sigue "matando" la App y cuando intentas recuperarla, se reinicia.

¡Y yo que pensaba que había resuelto el problema...!

Seguiremos investigando....

Saludos a todos.

dec 25-07-2017 13:47:27

Hola a todos,

Cita:

Empezado por jhonalone (Mensaje 519681)
Bueno, dec, siempre será mejor algo que nada.

Como mucho se le puede pedir al usuario que la active.

Pero si es que el tema está en que tú no deberías preocuparte por eso. Primero porque tendrías que pedir al usuario no ya que active una opción, pero, que active las opciones de desarrollador, para poder activar dicha opción. Pero es que no se trata de eso en absoluto.

Cita:

Empezado por jhonalone (Mensaje 519681)

Ah! por cierto, es una solución parcial, pues estoy comprobando, que cuando recuperas la App al poco tiempo, la mantiene intacta, pero (y esto lo sospecho, no estoy seguro) cuando pasa el tiempo seleccionado para la desactivación de la pantalla sigue "matando" la App y cuando intentas recuperarla, se reinicia.

Justamente, estás comprobando el buen comportamiento del sistema. El sistema da un "tiempo de gracia" a tu aplicación, de modo que, si vuelves a ella en poco tiempo, en efecto, no se ha reiniciado. Es precisamente, cuando pasa más tiempo, cuando el sistema decide que tu aplicación ha dejado de usarse por el usuario, que está en otras cosas... y que puede terminarla, para ahorrar recursos.

En definitiva, que no estamos ante un problema que haya que solucionar, sino ante cómo Android trata a las aplicaciones, no sólo la tuya, de modo que tenemos que adaptarnos a ese trato.

jhonalone 25-07-2017 14:22:11

Sé estás haciendo un gran esfuerzo, David.

El "tiempo de gracia" al que te refieres, sólo existe haciendo el cambio propuesto en modo desarrollador, si no haces este cambio, no hay "tiempo de gracia" que valga.

Mira, el programa en cuestión consiste en en una agenda para usuarios autónomos donde se gestiona desde el aviso del cliente hasta la emisión de la factura. Como cualquier programa que se precie, tendrá unas cuantas variables globales, para no estar repitiendo en cada Unit, y porque son utilizadas y modificadas por otras units.

Creo que no será el único programa que se haya "cargado" Android al optimizar el uso de los nuevos terminales, que, por cierto, tienen menos necesidad de recursos que los antiguos, pues disponen de bastante más memoria y almacenamiento que los anteriores. (Repito en los anteriores no pasaba esto)

Esta optimización, la entendería más en los antiguos terminales que en los nuevos.

En cualquier caso, "matar las aplicaciones" sin permiso del usuario me parece una acto de una dictadura absolutista sin ningún respeto. Recordemos lo del cambio de función de los botones o el problema generado en TMemo con el texto predictivo y ¡quién sabe cuantas cosas más nos iremos encontrando...!

Cuanto más lo pienso más grave veo el alcance del problema.

Android es un caprichoso dictador, que lo menos que se le podría pedir al desarrollar cada nueva versión es que respetara la compatibilidad con las anteriores. Creo yo.

Bueno, que me salgo del tema, espero que alguien pueda ayudarme, (y creo que no soy el único que necesita, o va a necesitar, esta ayuda)

A ver si entre todos conseguimos minimizar los efectos de la dictadura (dura) de Android.

Seguiremos trabajando.

Saludos a todos.

Casimiro Notevi 25-07-2017 17:12:29

Creo que estás confundido. Tanto ahora como antes, android cierra los programas que no se están utilizando dependiendo de las necesidades de memoria, recursos, el tiempo de inactividad, etc.
Lo que tú llamas "dictadura", realmente son las normas del funcionamiento de android, es como si dices que hay que acabar con la dictadura de eventos en windows, pero ¡¡¡windows es programación por eventos!!!
En cuanto a tu programa, por lo que dices, es simple, como una agenda que es, guarda los datos en una base de datos y no se perderán.

dec 25-07-2017 19:52:59

Hola a todos,

Cita:

Empezado por Casimiro Notevi (Mensaje 519688)
Creo que estás confundido. Tanto ahora como antes, android cierra los programas que no se están utilizando dependiendo de las necesidades de memoria, recursos, el tiempo de inactividad, etc.
Lo que tú llamas "dictadura", realmente son las normas del funcionamiento de android, es como si dices que hay que acabar con la dictadura de eventos en windows, pero ¡¡¡windows es programación por eventos!!!
En cuanto a tu programa, por lo que dices, es simple, como una agenda que es, guarda los datos en una base de datos y no se perderán.

Estoy de acuerdo con Casimiro. En el caso de una aplicación de tipo "agenda", digamos que habrá vistas o formularios desde los que poder añadir datos. Pues bien, sólo necesitarías guardar datos cuando se vaya a "background" si el usuario está en alguno de estos formularios, no en cualquier otro de la aplicación.

Supongamos que soy un usuario de tu aplicación y hago lo siguiente:
  1. Inicio la app
  2. Voy al listado de datos que me interese (formulario)
  3. Veo los datos, y, cambio de tu app a otra.

En el caso de arriba, no importará que tu aplicación se reinicie o no, puesto que a mí, como usuario, en nada me afecta. Podré dar de nuevo los mismos pasos sin necesidad de que hubieses guardado nada en los eventos "pause y resume".

Ahora supongamos este otro escenario:
  1. Inicio la app
  2. Voy a añadir un nuevo conctacto
  3. Estoy en ello, pero, me llaman por teléfono

En este caso, sí que deberías comprobar acaso que el usuario, en efecto, estaba en el formulario para añadir un nuevo contacto, y que, ya había empezado a escribir el nombre de dicho nuevo contacto. Pues bien, ahora sí, en el evento "pause", guardarías por ejemplo el nombre del formulario, así como los datos ya introducidos.

Cuando el usuario volviese de nuevo a la aplicación, esta comprobaría que lo hace desde un "reinicio" (esto ha de comprobarse de alguna forma, por ejemplo, guardando alguna "bandera" en algún sitio cuando la aplicación entra en "background"), y, si es así, buscaría en qué formulario se quedó el usuario y si hay algún dato ya escrito.

De modo que al usuario no le importaría si la aplicación se ha reiniciado o no, simplemente él ve que, cuando vuelve a la aplicación (terminó la llamada de teléfono) se encuentra en el formulario para añadir un contacto y se le muestra el nombre del nuevo contacto que escribió anteriormente, de modo que puede continuar con la tarea.

jhonalone 25-07-2017 21:39:29

Hola, Casimiro.

Sabes que te admiro por tus conocimientos y tu labor desinteresada en el foro.

Pero por primera vez, creo, (y pese al respeto y admiración que te tengo), no estoy de acuerdo contigo.

Lo que me estás diciendo, contradice mi experiencia con los aparatos en que he probado. Tengo varios probados y, a partir de la versión 4.4.4 ocurre ésto. Yo pensaba que era la 6.0.1 que es la última que yo uso, (sustituyendo a la 4.1.2 que usaba antes), pero he decidido probarlo en unos cuantos más y he comprobado que empieza a fallar a partir de la 4.4.4. En la 4.4.2 todavía no "mata" la app.

Observo que la primera vez que he visto con dos cuadrados superpuestos en el sensor inferior izquierdo, ha sido en la 4.4.4, en cuya versión ya estaba cambiado el comportamiento de los botones que explicaba en otro hilo.

Esto pasa desde que quitaron vkMenu de este sensor izquierdo.

También he podido comprobar que (en las opciones de desarrollador), la opción de "No mantener Actividades" por defecto está deshabilitada hasta la versión 6.0.1, en que viene habilitada por defecto.

Esto es lo que empíricamente he podido observar.

Por otro lado, con respecto a lo que dice David:

Sí, podemos hacer todos los arreglos que se nos ocurran. Detectar en la pantalla que estaba y restituirla. Lo cual no deja de ser una labor bastante ardua.

En lo que respecta a mi programa, no es una "simple agenda" es algo más. Lo puedes bajar y probarlo desde Google Play. Se llama "RegiControl". Entonces comprenderás lo que significa devolverle al sitio de interrupción. (Creo que tiene 12 o 14 unidades más un TWebBrowser para la ayuda en línea)

Por los datos no tengo problema, pues se van salvando al tiempo que se van tecleando.

Pero como lleva datos personales, al entrar debes teclear una clave de acceso. Y no me dirás que no es una imagen nefasta, tener que teclearla cada vez que dejas el programa para hacer otra cosa.

Claro. Tu me dirás "no pongas clave". Pues te digo que hay que ponerla porque lleva datos muy personales (Nif, direecciones, trabajos realizados...). No es una "simple agenda", es un sistema completo de control de tareas, presupuestos, trabajos en curso y facturación.

Sigo manteniendo que los cambios de versión de Android son una falta de respeto a los programadores, al menos los de Delphi, que son los que yo conozco.

El programa es bastante complejo y la solución no la veo sencilla, (si es que la hay).

¡Ah...! Os recuerdo que ya tuve que poner un mensaje avisando al usuario de que el teclado predictivo puede fallar a partir de la versión 6.0.1 de Android. En este hilo, que está sin poderse resolver.

Gracias, de nuevo, por vuestro interés.

Saludos.

Casimiro Notevi 25-07-2017 21:47:39

Cita:

Empezado por dec (Mensaje 519693)
Cuando el usuario volviese de nuevo a la aplicación, esta comprobaría que lo hace desde un "reinicio" (esto ha de comprobarse de alguna forma, por ejemplo, guardando alguna "bandera" en algún sitio cuando la aplicación entra en "background"), y, si es así, buscaría en qué formulario se quedó el usuario y si hay algún dato ya escrito.

Tras "reiniciar" (activity resume), pasa después a "activity create", pero con la "variable global" firstime que ahora tendrá valor false.


Casimiro Notevi 25-07-2017 22:04:30

Cita:

Empezado por jhonalone (Mensaje 519697)
Pero por primera vez, creo, ... no estoy de acuerdo contigo.

Haces bien, puedo estar equivocado :)
Cita:

Empezado por jhonalone (Mensaje 519697)
Lo que me estás diciendo, contradice mi experiencia con los aparatos en que he probado. Tengo varios probados y, a partir de la versión 4.4.4 ocurre ésto. Yo pensaba que era la 6.0.1 que es la última que yo uso, (sustituyendo a la 4.1.2 que usaba antes), pero he decidido probarlo en unos cuantos más y he comprobado que empieza a fallar a partir de la 4.4.4. En la 4.4.2 todavía no "mata" la app.
Observo que la primera vez que he visto con dos cuadrados superpuestos en el sensor inferior izquierdo, ha sido en la 4.4.4, en cuya versión ya estaba cambiado el comportamiento de los botones que explicaba en otro hilo.

A ver si es que no te estamos entendiendo bien los problemas que comentas. Por ejemplo, yo no tengo ni idea a qué te refieres con lo de "dos cuadrados superpuestos".
Por cierto, ese modo de funcionar ¿no serán funcionalidades instaladas por el fabricante de la marca de esos smartphones?

jhonalone 25-07-2017 22:04:42

Hola Casimiro. Gracias otra vez.

Habrás podido comprobar que estaba escribiendo cuando me has respondido.

Ya me contarás cómo puedo implementar lo que me propones. Porque yo sólo... creo que no.

Un saludo.

jhonalone 25-07-2017 22:41:24

1 Archivos Adjunto(s)
Bueno, Casimiro.

Los "cuadrados superpuestos" son una representación de dos ventanas en cascada, creo que lo he comentado antes. Hablo de los terminales Samsung que son los que yo uso. En la foto puedes ver los sensores a los que me refiero.

Los de la foto de arriba son de un Motorola, que están dentro de la pantalla del terminal y al que me refiero es el cuadrado de la derecha, que hace la misma función que los dos cuadraditos que aparecen a la izquierda de la foto inferior que corresponde a un terminal Samsung

Saludos.

Archivo Adjunto 3588

Casimiro Notevi 25-07-2017 22:44:07

Ok, está claro.

jhonalone 25-07-2017 22:50:39

Hola.

Tengo que deciros que no he comprobado el problema en el Motorola, pues es de un amigo de mi hijo que estaba casualmente en casa.

Saludos.

Casimiro Notevi 25-07-2017 22:57:23

Entonces, para resumir:
Cita:

Empezado por jhonalone (Mensaje 519639)
Si seleccionas cualquier aplicación que no haya sido generada con Delphi, la retomas donde la dejaste.
Pero si eliges una que ha sido generada por Delphi... ¡¡SORPRESA!! La aplicación se reinicia y arranca desde el principio, como si la hubieras llamado pulsando su icono.

Es que eso no tiene nada que ver con delphi, eso es la forma de funcionamiento normal de todos los programas android.
Cuando "duermes" un programa y lo vuelves a "despertar" (lo que tú llamas "reiniciar") vuelve a empezar de nuevo, se pierden todos los valores en las variables, etc.
Y es exactamente el mismo comportamiento cuando giras la pantalla.

Ahora bien, todo eso es controlable, tú puedes saber si es la primera vez que inicia el programa o si es que está "despertando" tras haber "dormido" (o se ha girado la pantalla) y depende de ti controlarlo guardando los datos que necesites y volviendo a restaurarlos.

No sé cómo es el mecanismo ese en delphi porque para android utilizo otra cosa (no existía delphi para android cuando empecé a programar android), pero seguro que debe poderse hacer lo que necesitas, debe ser algo básico, aunque parezca complicado, como todo lo que no se conoce.

No puedo ayudar mucho en eso porque no tengo ningún delphi moderno, pero intentaré ayudarte en lo que pueda.

jhonalone 25-07-2017 23:46:42

Gracias por el interés que te estás tomando Casimiro.

Estoy convencido de que no es un problema sólo de Delphi. He comprobado que otros programas tienen el mismo comportamiento y no son de Delphi.

Al girar la pantalla no ocurre el mismo problema, al menos otros programas que he comprobado, aún siendo desarrollados en Delphi. Ni se resetean ni pierden la información de la pantalla.

Buenas noches. Mañana seguiremos.

Un saludo.

jhonalone 27-07-2017 11:31:24

Hola a todos.

Sigo trabajando en el asunto.
Ayer minimizé algunas aplicaciones (entre ellas la mía) y para mi sorpresa esta mañana al reactivarlas mantenían sus misma pantalla y posición, es decir: no se reiniciaban (reseteaban).

No me preguntéis porqué... el dispositivo siegue siendo el mismo y yo no he cambiado ningún ajuste.

Estoy probando esta mañana y... unas veces se reinician las App's y... otras no. A ver si consigo averiguar el comportamiento (a primera vista errático) del "lifecycle" de las App's en Android.

Estoy haciendo pruebas con un controlador de eventos que me sugirió TOPX en otro hilo. Pero creo que aunque controlemos el evento, lo más difícil será restituir los valores que tienen en ése momento todas las variables globales de la App y restituir la pantalla en la que se encontraba cuando perdió el foco. Sin olvidarnos de las comprobaciones que hace el programa al ejecutarse la primera vez...

Sigo pensando, que "matar" las App's arbitrariamente, es una solución irrespetuosa con el usuario por parte de Android. No quiero decir con esto que no haya que controlar la memoria y el espacio del dispositivo por seguridad de uso. Pero estaréis conmigo en que, llegado a un límite de recursos, sería mucho mas elegante y respetuso avisar al usuario y dejarle elegir cuál o cuáles App's desea cerrar. Digo yo. De hecho, el sistema ya te avisa cuando te queda poca batería.

Imagínate que estás en un editor de texto y tienes una parte escrita y necesitas ponerlo en "segundo plano" para hacer una llamada. Como otras veces ya lo habías dejado en segundo plano y lo has recuperado intacto, vuelves a hacer lo mismo, sin guardarlo. Pero en ése momento Android decide "matar" la aplicación del editor. Cuando intentas recuperarlo, ves que se reinicia el editor, vuelve a su posición de cuando le ejecutas por primera vez, y has perdido el trabajo. Si, claro, aprendes a no volver a minimizarlo sin salvar. Pero te acuerdas del padre de Android (si tiene) y el mal ya está hecho.

Creo que todos sabéis, por experiencia que, los errores (problemas) que aparecen al desarrollar un programa y que ocurren unas veces sí y otras no, son los peores de resolver.

Si consigo descubrir o solucionar algo, o si se me ocurre otra cosa os tendré al corriente.

Perdonar mi pesadez, pero creo que el tema tiene bastante importancia (o...¿quizá sólo es importante para mi?...)

Bueno. Saludos a todos.

Casimiro Notevi 27-07-2017 11:58:27

Cita:

Empezado por jhonalone (Mensaje 519791)
Imagínate que estás en un editor de texto y tienes una parte escrita y necesitas ponerlo en "segundo plano" para hacer una llamada. Como otras veces ya lo habías dejado en segundo plano y lo has recuperado intacto, vuelves a hacer lo mismo, sin guardarlo. Pero en ése momento Android decide "matar" la aplicación del editor. Cuando intentas recuperarlo, ves que se reinicia el editor, vuelve a su posición de cuando le ejecutas por primera vez, y has perdido el trabajo. Si, claro, aprendes a no volver a minimizarlo sin salvar. Pero te acuerdas del padre de Android (si tiene) y el mal ya está hecho.
Creo que todos sabéis, por experiencia que, los errores (problemas) que aparecen al desarrollar un programa y que ocurren unas veces sí y otras no, son los peores de resolver.
Si consigo descubrir o solucionar algo, o si se me ocurre otra cosa os tendré al corriente.
Perdonar mi pesadez, pero creo que el tema tiene bastante importancia (o...¿quizá sólo es importante para mi?...)
Bueno. Saludos a todos.

De toda la vida, con todos los sistemas, si no guardas lo que estás haciendo, te arriesgas a perderlo. No es nada nuevo ni "problema" exclusivo con android.
Cita:

Empezado por jhonalone (Mensaje 519791)
Perdonar mi pesadez, pero creo que el tema tiene bastante importancia (o...¿quizá sólo es importante para mi?...)

Creo, es mi opinión, que le estás dando demasiado importancia, a fin de cuentas es un teléfono con muuuuuchos añadidos, pero es un teléfono.
Puedes plantearte el problema de otra forma, por ejemplo, estás dando de alta un cliente y necesitas hacer una llamada, entonces cuando vas a salir (segundo plano, aparcar, dormir, llámalo como quieras) guardas los datos que se puedan perder y nada más, luego cuando inicias el programa de nuevo no habrás perdido nada, salvo que no estarás exactamente en la pantalla que estabas. No es nada trágico. Al menos, yo lo veo así.

jhonalone 27-07-2017 12:29:33

Cita:

Empezado por Casimiro Notevi (Mensaje 519792)
Puedes plantearte el problema de otra forma, por ejemplo, estás dando de alta un cliente y necesitas hacer una llamada, entonces cuando vas a salir (segundo plano, aparcar, dormir, llámalo como quieras) guardas los datos que se puedan perder y nada más, luego cuando inicias el programa de nuevo no habrás perdido nada, salvo que no estarás exactamente en la pantalla que estabas. No es nada trágico. Al menos, yo lo veo así.

Bueno... visto así... tengo que darte la razón.

Pero no es una bonita imagen para un usuario.

Un saludo.

jhonalone 28-07-2017 19:24:21

Hola a todos.

Investigando un poco, he visto que hay bastante gente molesta por este asunto, que yo pensaba que sería una obsesión mía. Podéis verlo aquí.

Saludos a todos.

Casimiro Notevi 28-07-2017 20:53:30

Bueno, es una persona y no hay nada concluyente, algunos le aconsejan algunas cosas distintas, no hay nada que aclare realmente nada.

jhonalone 29-07-2017 01:40:15

Hola Casimiro.

El link es una búsqueda. No es solo una persona. Hay varios links en la búsqueda. y te garantizo, que he visto algunas colecciones de preocupados más. Esto que pongo es un botón de muestra, si quieres, pongo otros cuantos links más, correspondientes a búsquedas en distintos idiomas.
Lo más preocupante es que "no hay nada concluyente". Lo que nos lleva a la dictadura de Android. Lo que significa que "yo mando". Si quieres como si no. O sea: un desprecio total a los usuarios. Lo mires como quieras. Hay maneras mucho más elegantes de resolver el problema de los recursos. (Personalmente, estoy seguro de que no es un problema de recursos, pues terminales con recursos sobrados reaccionan igual). Defender a Android en este aspecto, creo que es luchar contra corriente.
Saludos.

Casimiro Notevi 29-07-2017 11:24:58

Ya, si te entiendo, pero es que una persona (o unas pocas, o muchas personas) que se quejen de algo, no quiere decir que sea un fallo (será por quejas, habría que tirar a la basura todo: windows, android, linux, ios, delphi, visual studio, msoffice, etc.) porque en todos los casos hay miles de personas que se quejan de problemas.

En este caso, el fabricante de android ha decidido hacer algo que a unos les parecerá mal y a otros no, pero es así y no se puede hablar de "dictadura" de google, porque entonces imagina lo que podríamos hablar de la "dictadura" de windows o de cualquier otro.
Simplemente es así y hay que resolver la situación con lo que hay.
Esa es mi opinión.
Y por supuesto, yo no defiendo a android, más de una vez he dicho que es una mierda, aquí mismo en los foros. Lo mismo he dicho de windows muchas veces también :D

jhonalone 30-07-2017 14:00:57

Hola Casimiro.

Aún dándote la razón sigo pensando que es una forma de hacer las cosas poco respetuosa con el usuario.

Ahora que hablas de windows, es, realmente, otra dictadura, tan o más dura que la de Android(Google)
Te cuento una experiencia mía de hace un poco mas de un mes.

Tengo W10 en el portátil y hace un poco más de un mes recibo un mensaje de ésos que te asustan de Windows, que tengo que realizar una actualización importante. Bueno, paso del asunto las dos o tres primeras veces. Como se ponía pesado, y prometía que no se perdería mi información, accedo a realizar la actualización. Más de dos o tres horas haciendo una reinstalación completa del sistema.

Cuando termina la instalación, observo que me ha devuelto el tamaño de todos los textos y gráficos al tamaño original, pequeñito.

Yo soy un poco miope y había puesto el tamaño de los iconos, los títulos de las ventanas, los textos un poquito más grandes, vamos para no tener que forzar la vista cuando estoy trabajando.

Bien, aunque me sentí fastidiado, digo "bueno vamos a adaptarlo a mi gusto otra vez".

Pues NO. Han desaparecido todas ésas opciones de ajustar el terminal a tus necesidades o gustos. En su lugar existe una opción general para, basándose en un porcentaje, agrandar o achicar (no sé si achicar) el tamaño general de todo lo que aparece en la pantalla.

Un fracaso total. Intenté aumentar un 4 o un 5 por ciento y parecía que las vistas se habían agrandado un poquito. Cuando abro Delphi voy a Project/Opions... y, para mi sorpresa, veo que el árbol de las opciones de la izquierda tiene unas letras del tamaño que veis más arriba y no caben en el recuadro en que están ubicadas.

Un desastre más a mi lista de tener que soportar dictadores. Porque digamos lo que digamos "...que sepas que serlo eres..." como decía el gracioso genio de Mota. Pero como dices tu "es lo que hay". Yo que soy tan meticuloso..., estas cosas me ponen de muy mal humor...

Si todavía estás a tiempo, y tenéis personalizados los tamaños de letra, no actualicéis si no queréis que os pase lo que a mí. "Cuando las barbas de tu vecino veas pelar..."

Perdón por mis lamentos, y por haberme extendido tanto.

Saludos cordiales.

Casimiro Notevi 30-07-2017 14:17:15

Te entiendo, windows es desesperante. Alguna vez he visto ese problema de las actualizaciones infinitas, desesperantes, reinicios, más actualizaciones, más reinicios, etc...
Yo tengo algunas máquinas virtuales con windows para probar proyectos, pero personalmente hace muchos años que en mis equipos solamente tengo linux.

jhonalone 30-07-2017 16:45:31

Hola, Casimiro.

Ojala yo fuera un poco más joven y valiente para cambiarme a Linux.

El problema que le veo a Linux es que su uso está muy restringido y hay muchas menos herramientas. Hablo de oídas, porque sé que existe, pero, por estos motivos, nunca me he planteado cambiarme.

No olvidemos que Windows está el 100 por cien de las casas.

Linux me parece que está reservado a entornos más relacionados con la informática y a personal más preparado. (A lo mejor lo que digo son barbaridades, fruto de mi desconocimiento)

Como no me rindo fácilmente,(soy muy persistente), si algún día encuentro una solución o un parche para evitar que Android se "coma" por su cuenta y riesgo mis aplicaciones retomaré este hilo. O si alguien encuentra la solución antes que yo, por favor, que la comparta que estoy esperando...
Saludos cordiales.

Casimiro Notevi 30-07-2017 17:48:13

Cita:

Empezado por jhonalone (Mensaje 519865)
Ojala yo fuera un poco más joven y valiente para cambiarme a Linux.

Ya sabes eso de "nunca es tarde...", y no creas que yo soy un jovencito, estoy cerca de ti, seguramente :rolleyes:
Cita:

Empezado por jhonalone (Mensaje 519865)
El problema que le veo a Linux es que su uso está muy restringido y hay muchas menos herramientas. Hablo de oídas, porque sé que existe, pero, por estos motivos, nunca me he planteado cambiarme.

¿Restringido?, el que está restringido es windows. Linux es libre, no tiene restricciones.
Cita:

Empezado por jhonalone (Mensaje 519865)
No olvidemos que Windows está el 100 por cien de las casas.

No, para nada, conozco más gente que usa linux que windows. Familiares, amigos, conocidos, vecinos, empresas... y no solo como servidor. Así que ya es menos del 100% ;)
Cita:

Empezado por jhonalone (Mensaje 519865)
Linux me parece que está reservado a entornos más relacionados con la informática y a personal más preparado. (A lo mejor lo que digo son barbaridades, fruto de mi desconocimiento)

El problema es que la mayoría de los nuevos que llegan a linux quieren hacer las cosas igual que con windows, y si no pueden o no saben hacer algo, se quejan y se frustran. Hay que tener paciencia, como en todas las cosas nuevas que hay que aprender.
No se puede pretender llevar usando windows durante los últimos 15 años y querer manejar linux igual en un par de horas, y eso es lo que quieren conseguir casi todos.
A mí, windows, me resulta extraño, complejo, enrevesado, frustrante, lento, dictatorial ;), chapuza, birria, etc.
Por supuesto que linux no es perfecto, pero no hay comparación en seguridad, agilidad, personalización, etc. comparado con windows.
Linux es distinto a windows, simplemente.
Cita:

Empezado por jhonalone (Mensaje 519865)
Como no me rindo fácilmente,(soy muy persistente), si algún día encuentro una solución o un parche para evitar que Android se "coma" por su cuenta y riesgo mis aplicaciones retomaré este hilo. O si alguien encuentra la solución antes que yo, por favor, que la comparta que estoy esperando...
Saludos cordiales.

Tal vez puedas crear un "servicio" para que siempre esté en funcionamiento. No tengo ni idea de cómo será en delphi, puede que debas buscar información sobre ello, creo que sería la solución a "tu problema" :)

AgustinOrtu 30-07-2017 19:37:58

Cita:

Pues NO. Han desaparecido todas ésas opciones de ajustar el terminal a tus necesidades o gustos. En su lugar existe una opción general para, basándose en un porcentaje, agrandar o achicar (no sé si achicar) el tamaño general de todo lo que aparece en la pantalla.

Un fracaso total. Intenté aumentar un 4 o un 5 por ciento y parecía que las vistas se habían agrandado un poquito. Cuando abro Delphi voy a Project/Opions... y, para mi sorpresa, veo que el árbol de las opciones de la izquierda tiene unas letras del tamaño que veis más arriba y no caben en el recuadro en que están ubicadas.
Eso sí no estoy errado se llama High DPI. Lo cual es una nueva API de Windows, que podes elegir si soportarla o no en tus aplicaciones. Es lo que se conoce como una aplicación High DPI aware. El IDE de Delphi no lo era, de hecho la Vcl tampoco tenía soporte para esta característica hasta hace poco. Entonces Embarcadero le habilitó el DPI al IDE y todo se fue al demonio, porque hay varios bugs en la Vcl con respecto a ese tema. Hay varios reportes en el sitio de incidencias. Por lo que no es culpa de Windows que se vea mal, sino de la Vcl


Más allá de estar de acuerdo con ustedes, te recomiendo el uso de gafas para usar el PC. Yo también soy miope y créeme que es mejor no forzar la vista ni usar parches como aumentar el tamaño de la letra

AgustinOrtu 30-07-2017 19:49:03

Te iba a sugerir que uses el SaveState, que es algo que ya comentaste en el hilo. A ver si este material te puede ayudar
https://community.embarcadero.com/bl...sing-savestate

Por lo que veo te permite grabar el form como un stream, y luego para leerlo hace eso mismo. Es un mecanismo similar a como se lee en tiempo de ejecución el recurso .dfm para recrear el form que vemos en tiempo de diseño

jhonalone 30-07-2017 22:36:45

Hola a todos.

Gracias a Casimiro y a Agustín por vuestro interés.

Casimiro. Me parece muy interesante tu idea. Ya la había estado barajando y buscando información en internet y tengo algunos proyectos en la cabeza. Pero ahora estoy enfrascado en una modificación de seguridad del programa y las tengo aparcadas. No olvidadas ni desechadas.

Agustín. He estado visitando el link que me dejaste y me he descargado el proyecto de prueba. Todavía no lo he probado, por la misma razón. En principio parece interesante, pero sospecho que, como comenté más arriba, el problema de SaveState va a seguir siendo el mismo: puedes salvar la posición del programa, pero lo realmente complicado son los valores que llevan todas las variables globales y que pueden haber sido cambiados. Si no salvas estos valores y los recuperas, el programa se descolocará. Mi programa en concreto, necesita de ésas variables globales para su correcto funcionamiento. Con respecto a usar gafas, las llevo desde los 6 años y tengo 65, (7 dioptrías en un ojo y 8 en el otro). Os lo cuento para que nos vayamos conociendo.

Seguiré peleando... y os contaré. "¡En peores plazas he lidiado...!, " (como dijo aquél).

Saludos cordiales.

Casimiro Notevi 30-07-2017 22:53:17

Todavía falta mucho para la jubilación ;)


La franja horaria es GMT +2. Ahora son las 11:58:08.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi