wake-up-neo.com

Änderung der Anzeigegröße

Ich migriere meine App-Target-SDK-Version auf Android oreo.

Eine der Änderungen, die sich auf die App auswirken könnten, besteht darin, dass bei einer Änderung der Anzeigegröße des Geräts die App, die Android Nougat und höher als Ziel hat, benachrichtigt wird, als ob die Ausrichtung des Geräts geändert wurde. Unten ist die Quelle.

Wenn sich die Gerätedichte ändert, benachrichtigt das System die laufenden Apps in die folgenden Möglichkeiten:

Wenn eine App auf API-Level 23 oder niedriger abzielt, wird das System automatisch tötet alle Hintergrundprozesse. Dies bedeutet, wenn ein Benutzer .__ wechselt. weg von einer solchen App, um den Bildschirm "Einstellungen" zu öffnen, und ändert die Wenn Sie die Anzeigegröße einstellen, beendet das System die App auf dieselbe Weise wie es wäre in einer Situation mit wenig Speicher. Wenn die App einen Vordergrund hat verarbeitet das System diese Prozesse über die Konfiguration Ändern Sie wie in Laufzeitumwandlungen beschrieben so, als ob die Die Ausrichtung des Geräts hatte sich geändert . Wenn eine App auf Android 7.0 zielt, werden alle seiner Prozesse (Vordergrund und Hintergrund) werden über die .__ informiert. Konfigurationsänderung, wie unter Umgang mit Laufzeitänderungen beschrieben.

Jetzt hat meine App einen langwierigen Prozess, der in einem Async-TSak in einer Android-Aktivität ausgeführt wird. Dies bedeutet, dass die App über eine AsyncTask verfügt, die sich im Aktivitätscode befindet.

Ich erstelle beim Start der Async-Task ein Dialogfeld und blende es aus, wenn die Async-Task ihre Arbeit erledigt hat.

Angenommen, die Benutzer starten die Aufgabe und gehen dann zu der Einstellung und ändern die Anzeigegröße. Kehren Sie dann zu meiner App zurück. Dann wird das Dialogfeld der App durch den Async-Task entfernt, bis der Task ausgeführt wird dass die App die Aufgabe beendet hat, die App jedoch tatsächlich ausgeführt wird. Meine Aktivität reagiert jedoch auch wie neu gestartet, mit der Ausnahme, dass Async-Task ausgeführt wird.

Die Ausrichtung meiner App ist an das Porträt gebunden.

Wie soll ich mit einem solchen Szenario umgehen? Jede Hilfe wird geschätzt. Vielen Dank!

BEARBEITEN: Dies ist das Szenario

1) App starten

2) Hauptbildschirm

3) Benutzer drücken eine Taste

4) AsyncTask im Hauptbildschirm gestartet

5) Ein Dialogfeld wird mit dem Fortschritt der Aufgabe angezeigt

6) Der Benutzer minimiert die App und wechselt zur Einstellung 

7) Ändert die Anzeigegröße/-dichte oder die Schriftgröße des Geräts

8) Meine App wird vom Betriebssystem so aufgerufen, als würde sich die Gerätedrehung ändern 

9) Dann kehrt der Benutzer zur App zurück 

10) Das angezeigte Dialogfeld wird jedoch nicht mehr angezeigt 

11) Die asynchrone Aufgabe läuft jedoch im Hintergrund und führt ihre Aufgabe immer noch aus

12) Die Aufgabe ist tatsächlich erledigt, aber der Benutzer denkt, dass die Aufgabe immer noch nicht erledigt ist.

8
Rahulrr2602

Überprüfen Sie in Ihrer on_resume () -Methode, ob die Bildschirmgröße und die Schriftgröße nicht geändert wurden. Wenn dies der Fall ist, passen Sie das Dialogfeld entsprechend an, entfernen Sie es und erstellen Sie es neu. Dies ist vergleichbar mit der Bearbeitung von Ausrichtungsänderungen im angehaltenen Zustand (Hinzufügen der Schriftgröße als Bedingung).

BEARBEITEN:

Fügen Sie Android:configChanges="fontScale|density" zu Ihrer Manifestdatei hinzu.

static int fontScale = 1;
static int densityDpi = 0;

public void onConfigurationChanged(Configuration newConfig) {
  if (newConfig.fontScale != fontScale) {
    // destroy and recreate dialog adjusting for font size.
    fontScale = newConfig.fontScale;
  }
  if (newConfig.densityDpi != densityDpi) {
    // destroy and recreate dialog adjusting for new screen size.
    densityDpi = newConfig.densityDpi;
  }
}

Es ist wahrscheinlich besser, Benachrichtigungen für die asynchrone Task zu verwenden, da sie nicht von Konfigurationsänderungen betroffen sind und nicht unter Bedingungen mit wenig Arbeitsspeicher beendet werden. 

2
Strom

Wenn Sie das Telefon drehen, wird Ihre Aktivität tatsächlich zerstört und neu erstellt. Dies beinhaltet Ihren Dialog. Es gibt zwei Möglichkeiten, das Problem zu beheben:

1) Deaktivieren Sie diese "hilfreiche" Funktion. Wenn Sie keine unterschiedlichen Layouts für Landschaft und Porträt haben, würde ich vorschlagen. Fügen Sie Android: configChange = "Orientation | Größe ändern" zu Ihrer Aktivität im Manifest hinzu.

2) Implementieren Sie onSaveInstanceState/onRestoreInstanceState und verfügen Sie über eine Variable, die angibt, ob Sie das Dialogfeld neu erstellen und neu starten müssen.

Vorschläge: Verwenden Sie WorkManager zum Planen der Aufgabe und auch ViewModel aus den Android-Architekturkomponenten, wodurch der Status auch nach den Konfigurationsänderungen erhalten bleibt

2
swanand keskar