Fangen wir einfach an:
Jedes Basic4android Programm läuft in seinem eigenen Prozess.
Ein Prozess hat einen Hauptthread der auch UI Thread genannt wird und so lange lebt wie der Prozess. Ein Prozess kann auch mehrere Threads haben die für Hintergrundaufgaben nützlich sind.
Ein Prozess startet wenn der Benutzer eine Anwendung startet, angenommen dass sie nicht schon im Hintergrund läuft.
Das Ende eines Prozesses ist weniger ausschlaggebend. Es ereignet sich etwas später nachdem der Benutzer oder das System alle Activities geschlossen hat.
Wenn man zum Beispiel ein Activity offen hat und der Benutzer drückt auf die Back Taste dann wird die Activity geschlossen. Später, falls dem Gerät der freie Speicherplatz zu gering wird (was eventuell vorkommen kann) wird der Prozess zerstört. Wenn der Benutzer das Programm wieder startet, und der Prozess noch nicht zerstört war, wird der gleiche Prozess wieder verwendet.
Eine Basic4android Anwendung besteht aus einem oder mehreren Activities. Android unterstützt aber noch einige andere "Hauptkomponenten". Diese werden in Zukunft in Basic4android hinzu gefügt.
Activities sind den Forms von Windows ähnlich.
Einer der Hauptunterschiede ist dass, wenn eine Activity nicht im Vordergrund ist kann sie zerstört werden um Speicherplatz zu sparen. Man sollte normalerweise den Stand der Activity speichern bevor sie verloren geht. Entweder in einem Dauerspeicher oder in einem Speicher der dem Prozess zugeordnet ist.
Später wird die Activity wieder erstellet wenn sie gebraucht wird.
Ein andere heikler Punkt ist wenn im Gerät eine bedeutende Konfigurationsänderung vorkommt. Die gewöhnlichste ist eine Orientierungsänderung (der Benutzer dreht das Gerät). Wenn so eine Änderung vorkommt werden die laufenden Activities zerstört und dann wieder neu erstellt. Jetzt, wenn die Activity wieder erstellt wird kann man sie an die neue Konfiguration anpassen (zum Beispiel, die Maße des neuen Bildschirms sind bekannt).
Wie macht man das?
Wenn man eine neue Activity erstellt fängt man mit folgender Codevorlage an:
Variablen können entweder global oder lokal sein. Lokale Variablen sind Variablen die in Subroutinen ausserhalb 'Sub Process_Globals' und 'Sub Globals' deklariert sind.
Lokale Variablen sind nur im Rahmen der Subroutine gültig in der sie deklariert wurden. Sobald die Subroutine verlassen wird existieren diese Variablen nicht mehr.
Globale Variablen können in allen Subroutinen verwendet werden.
Es gibt zwei Arten von globalen Variablen.
Prozessvariablen und Activityvariablen.
Prozessvariablen – Diese Variablen leben so lange wie der Prozess lebt.
Diese Variablen müssen in der 'Sub Process_Globals' Routine deklariert werden.
Diese Subroutine wird bei jedem Prozesstart aufgerufen (das gilt für alle Activities, nicht nur für die erste Activity).
Nur diese Variablen sind 'öffentliche' Variablen (public variables). Das heisst dass sie auch in anderen Modulen verwendet werden können.
Es können jedoch nicht alle Objektarten als Prozessvariablen deklariert werden.
Zum Beispiel, Views können nicht als Prozessvariablen deklariert werden.
Der Grund dafür ist dass man keine Referenz für Objekte behalten kann die zusammen mit den Activities zerstört werden.
Mit anderen Worten, wenn die Activity zerstört wird, werden alle Views welche die Activity enthält auch zerstört.
Falls wir eine Referenz zu einer View behalten würden, wäre der Garbagecollector (Müllsammler) nicht in der Lage diese Ressourcen frei zu geben und wir würden zu Speichermangel kommen.
Der Compiler unterstützt diese Anforderung.
Activityvariablen – Diese Variablen sind in der Activity begrenzt.
Diese Variablen müssen in der 'Sub Globals' Routine deklariert werden.
Diese Variablen sind "private variables", 'private' Variablen und können nur im laufenden Activitymodul verwendet werden.
Alle Objekttypes können als Activityvariablen deklariert werden.
Jedes mal wenn die Activity erstellt wird, wird die 'Sub Globals' Routine aufgerufen und dies bevor die 'Sub Activity_Create' Routine aufgerufen wird.
Diese Variablen existieren nur solange die Activity existiert.
Sub Activity_Create (FirstTime As Boolean)
Diese Subroutine ist bei jeder Activity Erstellung aufgerufen.
Die Activity wird erstellt wenn der Benutzer die Anwendung startet, die Gerätekonfiguration geändert wurde (der Benutzer dreht das Gerät) und die Activity wurde zerstört, oder wenn die Activity im Hintergrund war und das System sie zerstört hat wegen Speicherplatz Gewinn.
Diese Subroutine benutzt man hauptsächlich zum laden oder erstellen des Layouts (unter anderen Benutzungen).
Der 'FirstTime' Parameter sagt ob die Activity das erste mal erstellt wurde. 'First time' unterliegt dem laufenden Prozess.
Man kann 'FirstTime' für alle Arten von Initialisierungen von Prozessvariablen verwenden.
Zum Beispiel wenn man eine Datei mit einer Liste von Daten hat die man einlesen will, liest man sie wenn 'FirstTime' True ist und speichert die Liste in einer Processvariable.
Jetzt sind wir sicher dass diese Datenliste solange zur Verfügung steht wie der Prozess lebt und es ist nicht nötig die Datenliste wieder zu lesen wenn die Activity neu erstellt wird.
Als Zusammenfassung, man testet ob 'FirstTime' True ist, und initialisiert alle Prozessvariablen.
Sub Activity_Resume und Sub Activity_Pause (UserClosed As Boolean)
Jedes mal wenn sich die Activity vom Vordergrund in den Hintergrund bewegt, wird die 'Sub Activity_Pause ' Routine angerufen.
'Sub Activity_Pause' wird auch aufgerufen wenn die Activity im Vordergrund ist und eine Konfigurationänderung vorkommt (das führt dazu das die Activity auf 'Pause' gestellt und nachher zerstört wird).
'Sub Activity_Pause' ist die letzte Stelle an der man wichtige Informationen speichern kann.
Allgemein gibt es zwei Mechanismen zum Sichern der Activity Parameter.
Informationen die nur für die laufende Anwendung relevant sind können in eine oder mehrere Prozessvariablen gespeichert werden.
Andere Informationen müssen in einem Dauerspeicher gesichert werden (Datei oder Datenbank).
Zum Beispiel, falls der Benutzer Konfigurationsparameter geändert hat müssen diese hier gesichert werden. Ansonsten gehen diese Daten verloren.
'Sub Activity_Resume' wird direkt nachdem 'Sub Activity_Create' endet aufgerufen, oder wenn eine Activity von Pause zurück kommt (wenn eine Activity in den Hintergrund bewegt wurde und wieder in den Vordergrund hervor gerufen wird).
Wenn man eine andere Activity mit StartActivity aufruft, wird die laufende Activity zuerst auf Pause gestellt und dann wird die andere Activity erstellt (wenn nötig), und 'Sub Activity_Resume' wird immer aufgerufen.
Wie oben beschrieben, wird 'Sub Activity_Pause' jedes mal aufgerufen wenn die Activity vom Vordergrund in den Hintergrund bewegt wird.
Das kommt vor wenn:
1. Eine andere Activity gestartet wird.
2. Die 'Home' Taste gedrückt wurde.
3. Ein Konfigurationsänderungsevent gefeuert wurde (Orientierungsänderung zum Beispiel).
4. Die 'Back' Taste gedrückt wurde.
In den Fällen 1 und 2, wird die Activity auf Pause gestellt und bleibt im Speicher da sie voraussichtlich wieder benutzt wird.
In Fall 3 wird die Activity auf Pause gestellt, zerstört und dann wieder neu erstellt (und resumed).
In Fall 4 wird die Activity auf Pause gestellt und zerstört. Ein Drücken auf die 'Back'
Taste ist dem Schliessen der Activity gleich. In diesem Fall ist es nicht nötig irgend welche spezifische Instanzinformationen zu speichern (zum Beispiel, der Standpunkt von Pacman in einem PacMan Spiel).
Der 'UserClosed' Parameter ist in diesem Fall True und in allen anderen Fällen False. Er ist auch True wenn man die 'Sub Activity.Finish' Routine aufruft. Diese Funktion stellt die Activity auch auf Pause und zerstört sie, ähnlich wie mit der 'Back' Taste.
Man kann den 'UserClosed' Parameter benutzen um zu entscheiden welche Daten gespeichert werden sollen und auch welche Prozessvariablen auf ihren Uhrsprungswert gesetzt werden sollen (zum Beispliel, die Pacman Stellung in die Mitte setzen falls die Stellung eine Prozessvariable ist).
Jedes Basic4android Programm läuft in seinem eigenen Prozess.
Ein Prozess hat einen Hauptthread der auch UI Thread genannt wird und so lange lebt wie der Prozess. Ein Prozess kann auch mehrere Threads haben die für Hintergrundaufgaben nützlich sind.
Ein Prozess startet wenn der Benutzer eine Anwendung startet, angenommen dass sie nicht schon im Hintergrund läuft.
Das Ende eines Prozesses ist weniger ausschlaggebend. Es ereignet sich etwas später nachdem der Benutzer oder das System alle Activities geschlossen hat.
Wenn man zum Beispiel ein Activity offen hat und der Benutzer drückt auf die Back Taste dann wird die Activity geschlossen. Später, falls dem Gerät der freie Speicherplatz zu gering wird (was eventuell vorkommen kann) wird der Prozess zerstört. Wenn der Benutzer das Programm wieder startet, und der Prozess noch nicht zerstört war, wird der gleiche Prozess wieder verwendet.
Eine Basic4android Anwendung besteht aus einem oder mehreren Activities. Android unterstützt aber noch einige andere "Hauptkomponenten". Diese werden in Zukunft in Basic4android hinzu gefügt.
Activities sind den Forms von Windows ähnlich.
Einer der Hauptunterschiede ist dass, wenn eine Activity nicht im Vordergrund ist kann sie zerstört werden um Speicherplatz zu sparen. Man sollte normalerweise den Stand der Activity speichern bevor sie verloren geht. Entweder in einem Dauerspeicher oder in einem Speicher der dem Prozess zugeordnet ist.
Später wird die Activity wieder erstellet wenn sie gebraucht wird.
Ein andere heikler Punkt ist wenn im Gerät eine bedeutende Konfigurationsänderung vorkommt. Die gewöhnlichste ist eine Orientierungsänderung (der Benutzer dreht das Gerät). Wenn so eine Änderung vorkommt werden die laufenden Activities zerstört und dann wieder neu erstellt. Jetzt, wenn die Activity wieder erstellt wird kann man sie an die neue Konfiguration anpassen (zum Beispiel, die Maße des neuen Bildschirms sind bekannt).
Wie macht man das?
Wenn man eine neue Activity erstellt fängt man mit folgender Codevorlage an:
B4X:
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
Lokale Variablen sind nur im Rahmen der Subroutine gültig in der sie deklariert wurden. Sobald die Subroutine verlassen wird existieren diese Variablen nicht mehr.
Globale Variablen können in allen Subroutinen verwendet werden.
Es gibt zwei Arten von globalen Variablen.
Prozessvariablen und Activityvariablen.
Prozessvariablen – Diese Variablen leben so lange wie der Prozess lebt.
Diese Variablen müssen in der 'Sub Process_Globals' Routine deklariert werden.
Diese Subroutine wird bei jedem Prozesstart aufgerufen (das gilt für alle Activities, nicht nur für die erste Activity).
Nur diese Variablen sind 'öffentliche' Variablen (public variables). Das heisst dass sie auch in anderen Modulen verwendet werden können.
Es können jedoch nicht alle Objektarten als Prozessvariablen deklariert werden.
Zum Beispiel, Views können nicht als Prozessvariablen deklariert werden.
Der Grund dafür ist dass man keine Referenz für Objekte behalten kann die zusammen mit den Activities zerstört werden.
Mit anderen Worten, wenn die Activity zerstört wird, werden alle Views welche die Activity enthält auch zerstört.
Falls wir eine Referenz zu einer View behalten würden, wäre der Garbagecollector (Müllsammler) nicht in der Lage diese Ressourcen frei zu geben und wir würden zu Speichermangel kommen.
Der Compiler unterstützt diese Anforderung.
Activityvariablen – Diese Variablen sind in der Activity begrenzt.
Diese Variablen müssen in der 'Sub Globals' Routine deklariert werden.
Diese Variablen sind "private variables", 'private' Variablen und können nur im laufenden Activitymodul verwendet werden.
Alle Objekttypes können als Activityvariablen deklariert werden.
Jedes mal wenn die Activity erstellt wird, wird die 'Sub Globals' Routine aufgerufen und dies bevor die 'Sub Activity_Create' Routine aufgerufen wird.
Diese Variablen existieren nur solange die Activity existiert.
Sub Activity_Create (FirstTime As Boolean)
Diese Subroutine ist bei jeder Activity Erstellung aufgerufen.
Die Activity wird erstellt wenn der Benutzer die Anwendung startet, die Gerätekonfiguration geändert wurde (der Benutzer dreht das Gerät) und die Activity wurde zerstört, oder wenn die Activity im Hintergrund war und das System sie zerstört hat wegen Speicherplatz Gewinn.
Diese Subroutine benutzt man hauptsächlich zum laden oder erstellen des Layouts (unter anderen Benutzungen).
Der 'FirstTime' Parameter sagt ob die Activity das erste mal erstellt wurde. 'First time' unterliegt dem laufenden Prozess.
Man kann 'FirstTime' für alle Arten von Initialisierungen von Prozessvariablen verwenden.
Zum Beispiel wenn man eine Datei mit einer Liste von Daten hat die man einlesen will, liest man sie wenn 'FirstTime' True ist und speichert die Liste in einer Processvariable.
Jetzt sind wir sicher dass diese Datenliste solange zur Verfügung steht wie der Prozess lebt und es ist nicht nötig die Datenliste wieder zu lesen wenn die Activity neu erstellt wird.
Als Zusammenfassung, man testet ob 'FirstTime' True ist, und initialisiert alle Prozessvariablen.
Sub Activity_Resume und Sub Activity_Pause (UserClosed As Boolean)
Jedes mal wenn sich die Activity vom Vordergrund in den Hintergrund bewegt, wird die 'Sub Activity_Pause ' Routine angerufen.
'Sub Activity_Pause' wird auch aufgerufen wenn die Activity im Vordergrund ist und eine Konfigurationänderung vorkommt (das führt dazu das die Activity auf 'Pause' gestellt und nachher zerstört wird).
'Sub Activity_Pause' ist die letzte Stelle an der man wichtige Informationen speichern kann.
Allgemein gibt es zwei Mechanismen zum Sichern der Activity Parameter.
Informationen die nur für die laufende Anwendung relevant sind können in eine oder mehrere Prozessvariablen gespeichert werden.
Andere Informationen müssen in einem Dauerspeicher gesichert werden (Datei oder Datenbank).
Zum Beispiel, falls der Benutzer Konfigurationsparameter geändert hat müssen diese hier gesichert werden. Ansonsten gehen diese Daten verloren.
'Sub Activity_Resume' wird direkt nachdem 'Sub Activity_Create' endet aufgerufen, oder wenn eine Activity von Pause zurück kommt (wenn eine Activity in den Hintergrund bewegt wurde und wieder in den Vordergrund hervor gerufen wird).
Wenn man eine andere Activity mit StartActivity aufruft, wird die laufende Activity zuerst auf Pause gestellt und dann wird die andere Activity erstellt (wenn nötig), und 'Sub Activity_Resume' wird immer aufgerufen.
Wie oben beschrieben, wird 'Sub Activity_Pause' jedes mal aufgerufen wenn die Activity vom Vordergrund in den Hintergrund bewegt wird.
Das kommt vor wenn:
1. Eine andere Activity gestartet wird.
2. Die 'Home' Taste gedrückt wurde.
3. Ein Konfigurationsänderungsevent gefeuert wurde (Orientierungsänderung zum Beispiel).
4. Die 'Back' Taste gedrückt wurde.
In den Fällen 1 und 2, wird die Activity auf Pause gestellt und bleibt im Speicher da sie voraussichtlich wieder benutzt wird.
In Fall 3 wird die Activity auf Pause gestellt, zerstört und dann wieder neu erstellt (und resumed).
In Fall 4 wird die Activity auf Pause gestellt und zerstört. Ein Drücken auf die 'Back'
Taste ist dem Schliessen der Activity gleich. In diesem Fall ist es nicht nötig irgend welche spezifische Instanzinformationen zu speichern (zum Beispiel, der Standpunkt von Pacman in einem PacMan Spiel).
Der 'UserClosed' Parameter ist in diesem Fall True und in allen anderen Fällen False. Er ist auch True wenn man die 'Sub Activity.Finish' Routine aufruft. Diese Funktion stellt die Activity auch auf Pause und zerstört sie, ähnlich wie mit der 'Back' Taste.
Man kann den 'UserClosed' Parameter benutzen um zu entscheiden welche Daten gespeichert werden sollen und auch welche Prozessvariablen auf ihren Uhrsprungswert gesetzt werden sollen (zum Beispliel, die Pacman Stellung in die Mitte setzen falls die Stellung eine Prozessvariable ist).
Last edited: