Pourquoi étendre une classe Application
?
Qu'y a-t-il pour moi là-dedans?
Pourquoi ferais-tu ça?
J'ai lu qu'il peut être utilisé pour déclarer des variables globales, est-ce tout ou existe-t-il d'autres applications?
De prime abord, je ne peux pas penser à un scénario réel dans lequel étendre Application est préférable à une autre approche ou nécessaire pour accomplir quelque chose. Si vous avez un objet coûteux et fréquemment utilisé, vous pouvez l'initialiser dans un service IntentService lorsque vous détectez que l'objet n'est pas présent. L’application elle-même s’exécute sur le thread d’interface utilisateur, alors que IntentService s’exécute sur son propre thread.
Je préfère transmettre les données d'activité en activité avec des intentions explicites ou utiliser SharedPreferences. Il existe également des moyens de transmettre des données d'un fragment à son activité mère à l'aide d'interfaces.
apk
dans notre mobile, il est composé de plusieurs blocs utiles tels que, par exemple, Activity
s, Service
s et Application
, indépendamment de Le Activity
utilisé par l’utilisateurApplication
,Cursor
et le refermer, puis à nouveau N’est pas bon pour la performance,Intent
s pour transmettre les données, mais elles sont maladroites et l’activité Elle-même peut ne pas exister dans certains cas, en fonction de la mémoire disponible.Application
,Application
pour lancer certaines opérations, telles que l'analyse Etc. puisque la classe d'application est démarrée avant que Activity
s ou Services
s soient en cours d'exécution,La classe d'application est l'objet qui a le cycle de vie complet de votre application. C'est votre couche la plus élevée en tant qu'application. exemple d'utilisations possibles:
stocker des variables globales qui sautent d’activité en activité. Comme Asynctask.
etc
Parfois, vous souhaitez stocker des données, telles que des variables globales auxquelles il faut accéder à partir de plusieurs activités, parfois partout dans l'application. Dans ce cas, l'objet Application vous aidera.
Par exemple, si vous souhaitez obtenir les données d'authentification de base pour chaque demande http, vous pouvez implémenter les méthodes pour les données d'authentification dans l'objet d'application.
Après cela, vous pouvez obtenir le nom d'utilisateur et le mot de passe pour n'importe laquelle des activités suivantes:
MyApplication mApplication = (MyApplication)getApplicationContext();
String username = mApplication.getUsername();
String password = mApplication.getPassword();
Et enfin, n'oubliez pas d'utiliser l'objet Application comme objet singleton:
public class MyApplication extends Application {
private static MyApplication xxx;
public MyApplication getInstance(){
return singleton;
}
@Override
public void onCreate() {
super.onCreate();
singleton = this;
}
}
Pour plus d'infos. S'il vous plaît cliquez sur ce LIEN
La classe Application est un singleton auquel vous pouvez accéder à partir de n'importe quelle activité ou de tout autre endroit où vous avez un objet Context.
Vous obtenez également un peu de cycle de vie.
Vous pouvez utiliser la méthode onCreate de l'application pour instancier des objets coûteux, mais fréquemment utilisés, tels qu'un assistant d'analyse. Ensuite, vous pouvez accéder à ces objets et les utiliser partout.
Meilleure utilisation de la classe d'application . Exemple: supposons que vous deviez redémarrer votre gestionnaire d'alarmes au démarrage terminé.
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);
}
Pas une réponse mais une observation : n'oubliez pas que les données de l'objet d'application étendu ne doivent pas être liées à une instance d'activité, car il est possible que deux instances de la même activité s'exécutent à même heure (une au premier plan et une non visible) .
Par exemple, vous démarrez votre activité normalement par le biais du lanceur, puis vous la "minimisez". Vous démarrez ensuite une autre application (par exemple Tasker) qui démarre une autre instance de votre activité, par exemple pour créer un raccourci, car votre application prend en charge Android.intent.action.CREATE_SHORTCUT. Si le raccourci est ensuite créé et que cet appel de création de raccourci de l'activité modifie les données de l'objet d'application, l'activité qui s'exécute en arrière-plan commencera à utiliser cet objet d'application modifié une fois qu'il sera ramené au premier plan.
Source: https://github.com/codepath/Android_guides/wiki/Understanding-the-Android-Application-Class
Dans de nombreuses applications, il n'est pas nécessaire de travailler directement avec une classe d'applications. Toutefois, il existe quelques utilisations acceptables d’une classe d’application personnalisée:
- Tâches spécialisées à exécuter avant la création de votre première activité
- Initialisation globale devant être partagée entre tous les composants (rapport d'incident, persistance)
- Méthodes statiques pour un accès facile à des données immuables statiques telles qu'un objet client de réseau partagé
Vous ne devriez jamais stocker de données d'instance mutables dans l'objet Application, car si vous supposez que vos données y resteront, votre application se bloquera inévitablement à un moment donné avec une exception NullPointerException. L'objet d'application n'est pas garanti pour rester en mémoire pour toujours, il sera tué. Contrairement aux idées reçues, l’application ne sera pas redémarrée à partir de zéro. Android va créer un nouvel objet Application et démarrer l'activité où l'utilisateur était auparavant pour donner l'illusion que l'application n'a jamais été supprimée.
Je vois que cette question manque une réponse. J'étends Application
parce que j'utilise Bill Pugh Singleton implementation ( voir référence ) et certains de mes singletons ont besoin de contexte. La classe Application
ressemble à ceci:
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;
}
}
Et les singletons ressemblent à ceci:
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();
}
}
De cette façon, je n'ai pas besoin d'un contexte à chaque fois que j'utilise un singleton et que je reçois une initialisation synchronisée paresseuse avec un minimum de code.
Astuce: la mise à jour du modèle de singleton Android Studio vous fait gagner beaucoup de temps.
L'utilisation de l'extension de l'application rend votre application sûre pour tout type d'opération que vous souhaitez tout au long de la période d'exécution de votre application. Maintenant, il peut s'agir de n'importe quel type de variables et supposons que si vous voulez extraire des données d'un serveur, vous pouvez mettre votre asynctask dans l'application pour qu'il le récupère à chaque fois et en continu, de sorte que vous obtiendrez automatiquement des données mises à jour .. Utilisez ce lien pour plus de connaissance ....
http://www.intridea.com/blog/2011/5/24/how-to-use-application-object-of-Android
Vous pouvez accéder aux variables de n'importe quelle classe sans créer d'objets, si elle est étendue par Application. Ils peuvent être appelés globalement et leur état est maintenu jusqu'à ce que l'application ne soit pas tuée.
Pour ajouter aux autres réponses indiquant que vous pouvez souhaiter stocker des variables dans l'étendue de l'application, pour tous les threads de longue durée ou autres objets nécessitant une liaison à votre application lorsque vous n'utilisez PAS d'activité (l'application n'est pas une activité). tels que ne pas pouvoir demander un service lié .. alors la liaison à l'instance d'application est préférée. Le seul avertissement évident avec cette approche est que les objets vivent aussi longtemps que l'application est active. Un contrôle implicite de la mémoire est donc nécessaire, sinon vous rencontrerez des problèmes liés à la mémoire, tels que des fuites.
Une autre chose que vous pouvez trouver utile est que, dans l'ordre des opérations, l'application commence avant toutes les activités. Durant cette période, vous pouvez préparer le ménage nécessaire avant votre première activité si vous le souhaitez.
2018-10-19 11:31:55.246 8643-8643/: application created
2018-10-19 11:31:55.630 8643-8643/: activity created