Spanish [SOLUCIONADO] Cerrar al salir

cas6678

Active Member
Licensed User
Longtime User
Hola a todos, tengo el siguiente problema:

Luego de ver la guia del ciclo de la vida creo que me quedo bastante claro. Ademas leyendo algun post de @bgsoft hice una pequeña correccion para no salir por error con el boton "atras"...

B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
    If KeyCode = KeyCodes.KEYCODE_BACK Then
          Dim result As Int
        result= Msgbox2("Esta seguro que quiere salir?","Atencion: Se pulsó salir","Si, salir ahora","", "No, cancelar",Null)
        If result=DialogResponse.POSITIVE Then Activity_Pause(True)
        If result=DialogResponse.NEGATIVE Then Return True
    End If
End Sub

de esta manera evito que se salga accidentalmente. Ahora bien, una vez que salgo la aplicacion no me desaparece de la memoria del dispositivo. Esto es un problema porque al arrancar la activity principal tengo...

B4X:
If FirstTime Then
    admin.Initialize("admin")
    serial1.Initialize("serial1")
End If

y esto es un problema porque al haberme quedado la aplicacion abierta al volver a entrar en la aplicacion FirstTime=false y necesito que no lo sea.

En resumen...hay alguna manera que al salir la aplicacion desapareza y no obligar al usuario a que despues de apagarla tenga que ir al boton izquierdo para que le aparezca y o bien darle a "cerrar todo" o bien darle a la X de la aplicacion en cuestion?
 

rscheel

Well-Known Member
Licensed User
Longtime User
Hola a todos, tengo el siguiente problema:

Luego de ver la guia del ciclo de la vida creo que me quedo bastante claro. Ademas leyendo algun post de @bgsoft hice una pequeña correccion para no salir por error con el boton "atras"...

B4X:
Sub Activity_KeyPress (KeyCode As Int) As Boolean
    If KeyCode = KeyCodes.KEYCODE_BACK Then
          Dim result As Int
        result= Msgbox2("Esta seguro que quiere salir?","Atencion: Se pulsó salir","Si, salir ahora","", "No, cancelar",Null)
        If result=DialogResponse.POSITIVE Then Activity_Pause(True)
        If result=DialogResponse.NEGATIVE Then Return True
    End If
End Sub

de esta manera evito que se salga accidentalmente. Ahora bien, una vez que salgo la aplicacion no me desaparece de la memoria del dispositivo. Esto es un problema porque al arrancar la activity principal tengo...

B4X:
If FirstTime Then
    admin.Initialize("admin")
    serial1.Initialize("serial1")
End If

y esto es un problema porque al haberme quedado la aplicacion abierta al volver a entrar en la aplicacion FirstTime=false y necesito que no lo sea.

En resumen...hay alguna manera que al salir la aplicacion desapareza y no obligar al usuario a que despues de apagarla tenga que ir al boton izquierdo para que le aparezca y o bien darle a "cerrar todo" o bien darle a la X de la aplicacion en cuestion?

Probaste con 'Activity.Finish' o también puedes probar con 'ExitApplication'.
 

cas6678

Active Member
Licensed User
Longtime User
Con activity.finish me sucede lo mismo. Pero ExitApplication me sirvio.

Muchas gracias.
 

cas6678

Active Member
Licensed User
Longtime User
He leido en otro post este comentario de @bgsoft :

Tienes que utilizar ExitApplication cierra por completo la app.
Es mala práctica (no lo digo yo, si no Erel) emplear el ExitApplication, hay que dejar que el sistema gestione las aplicaciones en segundo plano, y ya la parará del todo si lo cree conveniente a nivel de memoria.

La pregunta es:

a) Cual es el problemna que puede ocasionar?; y
b) Cual es otra opcion validad para no usar ExitApplication y obtener el mismo resultado?
 

dar2o3

Active Member
Licensed User
Longtime User
Sacado del ejemplo de @Erel del bluetooth: https://www.b4x.com/android/forum/threads/android-bluetooth-bluetoothadmin-tutorial.14768/#content


B4X:
Sub Activity_Create(FirstTime As Boolean)
    If FirstTime Then
        admin.Initialize("admin")
        serial1.Initialize("serial1")
    End If
    Activity.LoadLayout("1")
End Sub

Sub Activity_Resume
'Esto no viene en el ejemplo pero sin probarlo la lógica dice que preguntemos si los objetos están o no inicializados.
If admin.IsInitialized=False Then
        admin.Initialize("admin")
End If

If serial1.IsInitialized=False Then
        serial1.Initialize("serial1")
End If

End Sub


Sub Activity_Pause (UserClosed As Boolean)
    If UserClosed = True Then
        serial1.Disconnect
    End If
End Sub
 
Last edited:

dar2o3

Active Member
Licensed User
Longtime User
La pregunta es:

a) Cual es el problemna que puede ocasionar?

Usar ExitApplication rompe con "el ciclo de vida natural" de la aplicación, es decir no se va a ejecutar el
Activity_Pause ni el Activity_Resume ni nada a partir de ese comando, normalmente cuando diseñamos una aplicación, pensamos con la lógica que va a seguir la app "ciclo de vida" si nos acostumbramos a usar ExitApplication, se me ocurren muchos casos en los que por ejemplo dejemos conexiones sql abiertas, bluetooth pillado (en tu caso,) no se muchas cosas, quiero pensar que por ahí van los tiros, si alguien lo tiene mas claro que me corrija.
 

cas6678

Active Member
Licensed User
Longtime User
Sobre lo primero: Fantastico, como siempre pasaremos por activity resume despues de activity create si no lo inicializamos en create lo haremos en resume. Ahora que lo se parece bastante simple. :p:p:p

Sobre lo segundo: Me da que no es solo por no dejar cosas abiertas. En mi caso antes del ExitApplication habia puesto el cierre de la conexion bluetooth. Pone que activity finish es mejor que ExitApplication porque en el primero el sistema operativo decide cuando matar la aplicacion....pero para queremos esperar a que el sistema operativo la mate sola cuando quiera si nosotros ya queriamos eliminarla antes.

De todas maneras con tu primera aportacion voy a poder cambiar a activity finish el ExitApplication. Entiendo que al hacer activity finish tambien pasara por activity pause con UserClosed true, no?
 

dar2o3

Active Member
Licensed User
Longtime User
Android deja en segundo plano las aplicaciones usadas con el fin de abrirlas más rápidamene en caso de querer volver a usarlas y para ahorrar energia, aunque parezca raro en principio, es mas económico dejar la app en segundo plano "backstage" que cerrarla liberando memoria ram y volver a abrirla cuando se requiera, (mas consumo de energía) al final la memoria ram que no se utiliza se está perdiendo, es como llenar una botella a medias, la ram está para ser utilizada!!! Ya se encargará el "recolector de basura" de android de eliminar lo que le haga falta cuando le haga falta.


Para tu pregunta con el activity.finish, mejor que responderte yo, prueba tu, solo tienes que poner logs y ver que ocurre, así entenderás mejor lo que pasa, a mi cuando me llevan en coche me fijo menos en la ruta ;););)
 
Top