statische Variable null beim Zurückkehren zur App

In meiner App gibt es eine statische Variable, die auf Null gesetzt wird, wenn ich über den externen Browser zu meiner App zurückkehre. Scheint so, als würde die App oder ein Teil davon gelöscht, wenn die externe Webseite, die ich starte, komplex genug ist.

Wenn die App vollständig gelöscht und dann wieder von der Hauptaktivität zurückgegeben werden sollte, wäre der Neustart von der Aktivität, mit der der Browser gestartet wurde, nicht beabsichtigt, den App-Status festzulegen, sodass er beim Zugriff auf die statische Nullvariable abstürzt . Dies ist ein Problem mit einem von sechs möglichen Geräten, daher brauche ich einen Rat.

Gibt es ein Flag, um dieses Verhalten zu verhindern?

    Dies ist Standard Verhalten in den meisten mobilen Betriebssystemen, definitiv einschließlich Android. Ihre App wird in der Tat sehr oft beendet, wenn eine andere Anwendung mit höherer Priorität (im Allgemeinen, wenn sie im Vordergrund ist, eine höhere Priorität hat) die Ressourcen benötigt. Dies liegt an der Natur von mobilen Geräten mit relativ begrenzten Ressourcen.

    Sie sollten Ihre Daten dauerhaft speichern. Sie könnten diesen Artikel über allgemeine Datenspeicherung nützlich finden. Diese Frage sollte ebenfalls relevant sein: Speichern des Android Activity-Status mit Save Instance State

    Beachten Sie, dass dies in Wirklichkeit kein Problem mit einem von sechs möglichen Geräten ist. Dies ist ein “Problem” auf allen Geräten, es ist nur auf einem Ihrer Geräte offensichtlich, wahrscheinlich weil es weniger Speicher hat. Wenn Sie eine sehr speicherintensive App auf einem Ihrer anderen Geräte ausführen, sollten Sie dasselbe Verhalten sehen. Es gibt auch keine Flagge, um dies zu verhindern. Dies ist Standard und wird erwartet.

    Normalerweise geschieht dies, wenn das Gerät in den Schlafmodus wechselt .

    Dieses Verhalten des Geräts kann durch die folgenden Schritte emuliert werden:

    1. Führen Sie die App aus und drücken Sie die Home-Taste
    2. Wählen Sie in Android Studio in der unteren linken Ecke die Anwendung aus und drücken Sie die X-Taste (Anwendung beenden) links neben dem Anwendungsnamen. (Weiß nicht, wie man Eclipse, aber ich denke ähnlich)
    3. Klicken Sie auf das Anwendungssymbol auf dem Gerät .

    Wenn es sich bei der Aufgabe um eine Aktivität handelt, wird die App bei der letzten Aktivität geöffnet und (höchstwahrscheinlich) wird ein Fehler generiert, da alle statischen Variablen verlassen wurden .

    Die Lösung für die Verwendung von statischen (Singleton) in Android ist sehr einfach:

    Implementieren Sie eine class, die android.app.Application und alle Ihre Singleton-Initialisierung innerhalb von onCreate()

    Argumentation:

    • Die class, die die Anwendung erweitert, wird zuerst ausgeführt, selbst wenn der process Ihrer App aufgrund einer niedrigen Speicherbedingung beendet wird
    • Ihre App hat Kontext, sobald Application.onCreate () aufgerufen wird

    Nein … Sie sollten keine Daten in statischen Variablen auf Android speichern. Wenn du darauf bestehst, musst du in der Lage sein, es wiederherzustellen, wenn es null ist. Du solltest deinen Zustand mit Bündeln oder anderen Mitteln speichern.

    Sie müssen Ihre Werte in onSaveInstanceState speichern und in onRestoreInstanceState wiederherstellen, da alle statischen Werte null sind, wenn eine Aktivität in den Status stopped state geht.

    z.B:

      /* save my satatic hashmap in case of activity stopped to retrieve it again in onRestoreInstanceState method*/ @Override protected void onSaveInstanceState(Bundle outState) { super.onSaveInstanceState(outState); //Common.PERMISION_MAP static hashmap if (Common.PERMISION_MAP != null) { Iterator iterator = Common.PERMISION_MAP.values() .iterator(); ArrayList permissionList = new ArrayList(); while (iterator.hasNext()) { Permission permission = (Permission) iterator.next(); permissionList.add(permission); } outState.putParcelableArrayList("PERMISSION_LIST", permissionList); } } /* restore my satatic hashmap when activity stopped */ @Override protected void onRestoreInstanceState(Bundle savedInstanceState) { super.onRestoreInstanceState(savedInstanceState); try { ArrayList permissionList = savedInstanceState .getParcelableArrayList("PERMISSION_LIST"); if (Common.PERMISION_MAP == null) Common.PERMISION_MAP = new HashMap(); for (Permission permission : permissionList) { Common.PERMISION_MAP.put(permission, permission); } } catch (Exception ex) { String string = ex != null ? ex.getMessage() : ""; Log.e(TAG, (string != null ? string : "")); ex.printStackTrace(); } } 

    Sie wollen wahrscheinlich nur dem zweiten Link von kabuko folgen. Aber wenn Sie Ihre statische Variable behalten möchten (vielleicht haben Sie einen guten Grund dafür), könnten Sie das tun:

     private static MyObjType getVariable() { if (myVar == null) myVar = new MyObjType(); // do whatever else you need to here return myVar; } 

    Auf diese Weise können Sie Ihre Aufrufe von myVar.test () durch getVariable () .test () ersetzen, und Sie wissen, dass es niemals eine Nullzeiger-Ausnahme austriggers.

    Verwenden Sie die Anwendungsklasse für solche Dinge. Es wird immer instanziiert, bevor eine Komponente (Aktivitäten, Dienste, Empfänger) Ihrer App gestartet wird. Sie sind also sicher, dass alle statischen Variablen vorhanden und initialisiert sind.