Eine erweiterte Application
Klasse kann globale Variablen deklarieren. Gibt es noch andere Gründe?
Eine erweiterte Application
Klasse kann globale Variablen deklarieren. Gibt es noch andere Gründe?
Antworten:
Auf Anhieb kann ich mir kein reales Szenario vorstellen, in dem die Erweiterung der Anwendung entweder einem anderen Ansatz vorzuziehen ist oder notwendig ist, um etwas zu erreichen. Wenn Sie ein teures, häufig verwendetes Objekt haben, können Sie es in einem IntentService initialisieren, wenn Sie feststellen, dass das Objekt derzeit nicht vorhanden ist. Die Anwendung selbst wird auf dem UI-Thread ausgeführt, während IntentService auf einem eigenen Thread ausgeführt wird.
Ich bevorzuge es, Daten mit expliziten Absichten von Aktivität zu Aktivität zu übergeben oder SharedPreferences zu verwenden. Es gibt auch Möglichkeiten, Daten von einem Fragment über Schnittstellen an die übergeordnete Aktivität zu übergeben.
"prefer to pass data from Activity to Activity with explicit Intents, or use SharedPreferences"
. Wir sollten den globalen Status immer so weit wie möglich eliminieren und Standard-Android-Tools für die globale
apk
Datei in unserem Handy betrachten, besteht sie aus mehreren nützlichen Blöcken wie z. B. Activity
s, Service
s und anderen.Application
Zeitraum zugreifen müssen, unabhängig davon, welchen Activity
Benutzer der Benutzer verwendet.Application
,Cursor
und Schließen von SQLite ist nicht gut für die Leistung.Intent
s verwenden, um die Daten zu übergeben, aber es ist ungeschickt und die Aktivität selbst ist in einem bestimmten Szenario je nach Speicherverfügbarkeit möglicherweise nicht vorhanden.Application
,Application
, um bestimmte Dinge wie Analysen usw. zu starten, da die Anwendungsklasse gestartet wird, bevor Activity
s oder
Services
s ausgeführt werden.Anwendungsklasse ist das Objekt, das den gesamten Lebenszyklus Ihrer Anwendung aufweist. Es ist Ihre höchste Ebene als Anwendung. Beispiel mögliche Verwendungen:
Sie können beim Starten der Anwendung hinzufügen, was Sie benötigen, indem Sie onCreate in der Application-Klasse überschreiben.
Speichern Sie globale Variablen, die von Aktivität zu Aktivität springen. Wie Asynctask.
etc
Manchmal möchten Sie Daten speichern, z. B. globale Variablen, auf die über mehrere Aktivitäten zugegriffen werden muss - manchmal überall in der Anwendung. In diesem Fall hilft Ihnen das Anwendungsobjekt.
Wenn Sie beispielsweise die grundlegenden Authentifizierungsdaten für jede http- Anforderung abrufen möchten , können Sie die Methoden für Authentifizierungsdaten im Anwendungsobjekt implementieren.
Danach können Sie den Benutzernamen und das Passwort für eine der folgenden Aktivitäten erhalten:
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
Denken Sie schließlich daran, das Anwendungsobjekt als Singleton-Objekt zu verwenden:
public class MyApplication extends Application {
private static MyApplication singleton;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
Für weitere Informationen klicken Sie bitte auf Anwendungsklasse
Die Anwendungsklasse ist ein Singleton, auf den Sie von jeder Aktivität oder von jedem anderen Ort aus zugreifen können, an dem Sie ein Kontextobjekt haben.
Sie erhalten auch ein wenig Lebenszyklus.
Sie können die onCreate-Methode der Anwendung verwenden, um teure, aber häufig verwendete Objekte wie einen Analyse-Helfer zu instanziieren. Dann können Sie überall auf diese Objekte zugreifen und sie verwenden.
Beste Verwendung der Anwendungsklasse. Beispiel: Angenommen, Sie müssen Ihren Alarmmanager nach Abschluss des Startvorgangs neu starten.
public class BaseJuiceApplication extends Application implements BootListener {
public static BaseJuiceApplication instance = null;
public static Context getInstance() {
if (null == instance) {
instance = new BaseJuiceApplication();
}
return instance;
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onBootCompleted(Context context, Intent intent) {
new PushService().scheduleService(getInstance());
//startToNotify(context);
}
Keine Antwort, sondern eine Beobachtung : Beachten Sie , dass die Daten im erweiterten Anwendungsobjekt nicht an eine Instanz einer Aktivität gebunden sein sollten, da möglicherweise zwei Instanzen derselben Aktivität gleichzeitig ausgeführt werden (eine in) der Vordergrund und einer, der nicht sichtbar ist) .
Zum Beispiel starten Sie Ihre Aktivität normal über den Launcher und "minimieren" sie dann. Anschließend starten Sie eine andere App (z. B. Tasker), die eine andere Instanz Ihrer Aktivität startet, beispielsweise um eine Verknüpfung zu erstellen, da Ihre App android.intent.action.CREATE_SHORTCUT unterstützt. Wenn die Verknüpfung dann erstellt wird und dieser Verknüpfungserstellungsaufruf der Aktivität die Daten des Anwendungsobjekts ändert, verwendet die im Hintergrund ausgeführte Aktivität dieses geänderte Anwendungsobjekt, sobald es wieder in den Vordergrund gestellt wird.
Ich sehe, dass dieser Frage eine Antwort fehlt. Ich erweitere, Application
weil ich die Implementierung von Bill Pugh Singleton verwende ( siehe Referenz ) und einige meiner Singletons Kontext benötigen. Die Application
Klasse sieht so aus:
public class MyApplication extends Application {
private static final String TAG = MyApplication.class.getSimpleName();
private static MyApplication sInstance;
@Contract(pure = true)
@Nullable
public static Context getAppContext() {
return sInstance;
}
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate() called");
sInstance = this;
}
}
Und die Singletons sehen so aus:
public class DataManager {
private static final String TAG = DataManager.class.getSimpleName();
@Contract(pure = true)
public static DataManager getInstance() {
return InstanceHolder.INSTANCE;
}
private DataManager() {
doStuffRequiringContext(MyApplication.getAppContext());
}
private static final class InstanceHolder {
@SuppressLint("StaticFieldLeak")
private static final DataManager INSTANCE = new DataManager();
}
}
Auf diese Weise muss ich nicht jedes Mal einen Kontext haben, wenn ich einen Singleton verwende, und eine verzögerte synchronisierte Initialisierung mit minimaler Codemenge erhalten.
Tipp: Das Aktualisieren der Android Studio-Singleton-Vorlage spart viel Zeit.
Ich denke, Sie können die Anwendungsklasse für viele Dinge verwenden, aber sie hängen alle von Ihrer Notwendigkeit ab, einige Dinge zu tun, bevor eine Ihrer Aktivitäten oder Dienste gestartet wird. In meiner Anwendung verwende ich beispielsweise benutzerdefinierte Schriftarten. Anstatt anzurufen
Typeface.createFromAsset()
Aus jeder Aktivität, um Referenzen für meine Schriftarten aus dem Ordner "Assets" abzurufen (dies ist schlecht, da dies zu einem Speicherverlust führt, da Sie bei jedem Aufruf dieser Methode einen Verweis auf Assets behalten), mache ich dies aus der onCreate()
Methode in meiner Anwendungsklasse ::
private App appInstance;
Typeface quickSandRegular;
...
public void onCreate() {
super.onCreate();
appInstance = this;
quicksandRegular = Typeface.createFromAsset(getApplicationContext().getAssets(),
"fonts/Quicksand-Regular.otf");
...
}
Jetzt habe ich auch eine Methode wie diese definiert:
public static App getAppInstance() {
return appInstance;
}
und das:
public Typeface getQuickSandRegular() {
return quicksandRegular;
}
Von überall in meiner Bewerbung muss ich also nur Folgendes tun:
App.getAppInstance().getQuickSandRegular()
Eine andere Verwendung für die Anwendungsklasse besteht für mich darin, zu überprüfen, ob das Gerät mit dem Internet verbunden ist, BEVOR Aktivitäten und Dienste, für die eine Verbindung erforderlich ist, tatsächlich gestartet werden, und die erforderlichen Maßnahmen zu ergreifen.
Quelle: https://github.com/codepath/android_guides/wiki/Understanding-the-Android-Application-Class
In vielen Apps muss nicht direkt mit einer Anwendungsklasse gearbeitet werden. Es gibt jedoch einige akzeptable Verwendungen einer benutzerdefinierten Anwendungsklasse:
- Spezialisierte Aufgaben, die vor der Erstellung Ihrer ersten Aktivität ausgeführt werden müssen
- Globale Initialisierung, die von allen Komponenten gemeinsam genutzt werden muss (Absturzberichterstattung, Persistenz)
- Statische Methoden für den einfachen Zugriff auf statische unveränderliche Daten, z. B. ein freigegebenes Netzwerkclientobjekt
Sie sollten niemals veränderbare Instanzdaten im Anwendungsobjekt speichern, da Ihre Anwendung zwangsläufig irgendwann mit einer NullPointerException abstürzt, wenn Sie davon ausgehen, dass Ihre Daten dort verbleiben. Es ist nicht garantiert, dass das Anwendungsobjekt für immer im Speicher bleibt, es wird getötet. Entgegen der landläufigen Meinung wird die App nicht von Grund auf neu gestartet. Android erstellt ein neues Anwendungsobjekt und startet die Aktivität, bei der der Benutzer zuvor war, um die Illusion zu vermitteln, dass die Anwendung überhaupt nicht getötet wurde.
Sie können auf Variablen für jede Klasse zugreifen, ohne Objekte zu erstellen, sofern diese durch die Anwendung erweitert wurden. Sie können global aufgerufen werden und ihr Status bleibt erhalten, bis die Anwendung nicht beendet wird.
Durch die Verwendung der erweiterten Anwendung wird Ihre Anwendung nur für jede Art von Vorgang sichergestellt, die Sie während der gesamten Laufzeit Ihrer Anwendung ausführen möchten. Jetzt können es beliebige Variablen sein. Wenn Sie Daten vom Server abrufen möchten, können Sie Ihre Asynctask in die Anwendung einfügen, damit sie jedes Mal und kontinuierlich abgerufen wird, sodass Sie automatisch aktualisierte Daten erhalten. Verwenden Sie diesen Link für mehr wissen ....
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-android
Hinzufügen zu den anderen Antworten, die besagen, dass Sie möglicherweise Variablen im Anwendungsbereich speichern möchten, für alle lang laufenden Threads oder anderen Objekte, die an Ihre Anwendung gebunden werden müssen, wenn Sie KEINE Aktivität verwenden (Anwendung ist keine Aktivität). B. nicht in der Lage zu sein, einen gebundenen Dienst anzufordern. Dann wird die Bindung an die Anwendungsinstanz bevorzugt. Die einzige offensichtliche Warnung bei diesem Ansatz ist, dass die Objekte so lange leben, wie die Anwendung aktiv ist. Daher ist eine implizitere Kontrolle über den Speicher erforderlich, da sonst speicherbezogene Probleme wie Lecks auftreten können.
Etwas anderes, das Sie möglicherweise nützlich finden, ist, dass die Anwendung in der Reihenfolge der Vorgänge zuerst gestartet wird, bevor Aktivitäten ausgeführt werden. In diesem Zeitraum können Sie auf Wunsch alle erforderlichen Reinigungsarbeiten vorbereiten, die vor Ihrer ersten Aktivität durchgeführt werden.
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created