Commençons simplement:
Chaque programme Basic4android fonctionne dans son propre processus (process).
Un 'process' a un 'thread' (tâche) principal qui est aussi appelé 'UI thread' (UI > User Interface > interface utilisateur) qui reste actif aussi longtemps que le 'process' est actif. Un 'process' peut avoir plusieurs 'threads' ce qui peut être utile pour des tâches en arrière plan.
Un 'process' démarre quand l'utilisateur lance votre application, en admettant qu'elle ne tourne pas déjà en arrière plan.
La fin d'un 'process' est moins bien définie. Cela va arriver quelque temps après que l'utilisateur ou que le système ait fermé toutes les activités (activities).
Si, par exemple, vous avez une activité (activity) active et que l'utilisateur presse la touche 'Back', cette activité sera fermée. Par la suite, lorsque l'appareil commence par être à court de mémoire, le 'process' va être supprimé.
Si l'utilisateur relance le programme et que celui-ci n'a pas encore été supprimé par le système, le même 'process' sera réutilisé.
Un programme Basic4android peut être composé d'une ou plusieurs activités. Android supporte d'autres composantes 'principales' qui seront ajoutés à Basic4android dans le futur.
Les activités sont un peu similaires aux formes (forms) de Windows.
Une des différences majeure est que lorsqu'une activité n'est plus au premier plan elle peut être supprimée par le système pour récupérer de la mémoire. Il est utile de sauver l'état de l'activité avant qu'il ne soit perdu. Soit dans un élément de stockage ou dans la mémoire qui est associée au processus.
Par la suite, cette activité sera recréée en cas de besoin.
Un autre point particulier se produit lorsqu'il y a un changement majeur dans la configuration de l'appareil. Le plus courant est le changement d'orientation de l'appareil (l'utilisateur tourne l'appareil). Lors d'un tel changement, les activités actives sont détruites et puis recréées. Maintenant, lorsque nous créons l'activité elle le sera avec la nouvelle configuration (par exemple en fonction des nouvelles dimensions de l'écran).
Comment gérer tout cela?
Lorsque vous créez une nouvelle activité vous allez démarrer avec une trame de code comme ci-dessous:
Quote:
Sub Process_Globals
'These global variables will be declared once when the application starts.
'These variables can be accessed from all modules.
End Sub
Sub Globals
'These global variables will be redeclared each time the activity is created.
'These variables can only be accessed from this module.
End Sub
Sub Activity_Create(FirstTime As Boolean)
End Sub
Sub Activity_Resume
End Sub
Sub Activity_Pause (UserClosed As Boolean)
End Sub
Les variables peuvent être soit globales ou locales. Des variables locales sont des variables qui sont déclarées à l'intérieur des routines Sub autres que Sub Process_Globals ou Sub Globals.
Les variables locales ne sont valides qu'à l'intérieur de la routine dans laquelle elles ont été déclarées. Lorsqu'on quitte cette routine ces variables n'existent plus.
On peut accéder aux variables globales depuis n'importe quelle routine.
On considère deux types de variables globales.
Variables de 'process' et des variables d'activité.
Variables de 'process' - Ces variables sont actives aussi longtemps que le 'process' est actif.
Ces variables doivent être déclarées dans Sub Process_Globals.
Cette routine est appelée une seule fois lorsque le 'process' démarre (ceci est valable pour toutes les activités et pas seulement pour la première activité). Ces variables sont les seules qui sont "publiques". Cela veut dire qu'elles sont aussi accessible depuis d'autres modules.
Néanmoins, pas tous les objets peuvent être déclarés en tant que variables 'process'.
Toutes les objets 'views', par exemple, ne peuvent pas être déclarées comme variables 'process'.
La raison est qu'il n'est pas possible de garder des références pour des objets qui seront détruits en même temps que l'activité.
En d'autres termes, lorsqu'une activité est détruite, tous les objets appartenant à cette activité seront également détruits.
Si nous gardions une référence à un tel objet (view), le 'garbage collector' (récupérateur de mémoire) ne pourrait plus libérer ces ressources avec un risque de manque de mémoire.
Le compilateur nécessite cette condition.
Variables d'activité - Ces variables appartiennent à l'activité.
Ces variables doivent être déclarées dans Sub Globals.
Ces variables sont "privées" et ne sont accessibles que depuis le module de cette activité.
Tout type d'objet peut être déclaré comme variable d'activité.
A chaque fois qu'une activité est crée, Sub Globals est appelée (avant Sub Activity_Create).
Ces variables existent tant que l'activité existe.
Sub Activity_Create (FirstTime As Boolean)
Cette routine est appelée lors de la création de l'activité.
L'activité est crée lorsque
- l'utilisateur lance le programme,
- lorsque la configuration de l'appareil a changée (l'utilisateur tourne l'appareil) et que l'activité avait été détruite,
- ou lorsque l'activité était en arrière plan et que le système l'avait détruite pour récupérer de la mémoire.
Cette routine doit être utilisé pour charger ou créer des layouts (mise en page).
Le paramètre 'FirstTime' (première fois) indique si c'est la première fois que l'activité est créée. 'First time' se réfère au 'process' actif.
Vous pouvez utiliser 'FirstTime' pour effectuer toutes sortes d'initialisations en relation avec des variables process.
Par exemple, si vous avez un fichier contenant une liste de valeurs que vous voulez lire vous pouvez le faire lorsque 'FirstTime' = True et mémoriser la liste dans une variable process.
Du moment que cette liste est maintenant à disposition aussi longtemps que le 'process' existe il n'y a pas de raison de la relire lorsque l'activité est réactivée.
En résumé, vous pouvez tester si FirstTime = True et puis initialiser les variables process.
Sub Activity_Resume et Sub Activity_Pause (UserClosed As Boolean) A chaque fois que l'activité passe du premier plan en arrière plan, Sub Activity_Pause est applée.
Activity_Pause est aussi appelée lorsque l'activité est au premier plan mais que la configuration a changée (ce qui mène à ce que l'activité est mise en veilleuse (paused) et puis détruite).
Activity_Pause est le dernier endroit pour sauver des informations importantes.
En général il y a deux types de mécanismes pour sauver l'état de l'activité.
Les informations qui ne concernent que l'instance actuelle du programme peuvent être sauvées dans une ou plusieurs variables process.
D'autres informations doivent être sauvées dans une mémoire persistante (fichier ou base de données)
Par exemple, si l'utilisateur change des paramètres de configuration ils doivent être sauvés dans une mémoire persistante à cet endroit, sinon les changements seront perdus.
Activity_Resume (resume > reprendre ou réactiver) est appelé juste après Activity_Create ou après la reprise d'une activité en veilleuse (paused), (par exemple, une activité mise en arrière plan et puis réactivée).
Notez que si vous lancez une autre activité (en appelant StartActivity), l'activité actuelle est mise en veilleuse (paused) et puis la nouvelle activité est créée, si nécessaire, mais toujours 'resumed'. Ce qui veut dire que lors de l'activation d'une activité, Activity_Create peut être appelée si nécessaire, mais Activity_Resume est toujours appelée. Lorsqu'une activité est mise en veilleuse (paused) donc mise en arrière plan elle peut être détruite par le système pour récupérer de la mémoire mais elle peut aussi toujours être disponible. Dans le premier cas, Activity_Create et Activity_Resume sont appelées et dans le deuxième cas seul Activity_Resume est appelée.
Comme expliqué ci-dessus, Activity_Pause est appelée à chaque fois que l'activité est déplacée du premier plan vers l'arrière plan. Ceci qui survient lorsque:
1. Une activité différente est lancée.
2. Le bouton 'Home' est pressé.
3. Un évènement de changement de configuration est généré (changement d'orientation par exemple).
4. Le bouton 'Back' est pressé.
Dans les scénarios 1 et 2, l'activité sera mise en veilleuse (paused) et reste à disposition pour une utilisation ultérieue.
Dans le scénario 3, l'activité est mise en veilleuse (paused), détruite et à nouveau créée (create) et réactivée (resumed.
Dans le scénario 4, l'activité sera mise en veilleuse (paused) et détruite. Presser le bouton 'Back' est similaire à fermer l'activité. Dans ce cas il n'est pas nécessaire de sauver des données spécifiques à l'instance de l'activité puisque celle ci est détruite (par exemple la position de pacman dans le jeu PacMan).
Le paramètre 'UserClosed' (fermé par l'utilisateur) sera égal à True dans ce cas et sera égal à False dans tous les autres cas. Notez que 'UserClosed' sera aussi égal à True si vous appelez la fonction 'Activity.Finish'. Cette fonction met l'activité en veilleuse et la détruit comme avec le bouton 'Back'.
Vous pouvez utiliser le paramètre 'UserClosed' pour définir quelles données vous voulez sauver et aussi décider quelles variables process vous voulez réinitialiser à leur valeur initiale (par exemple déplacer pacman au centre de l'écran si cette position est une variable process).