web-dev-qa-db-fra.com

Pourquoi étendre une classe d'application?

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?

150
TN888

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.

25
Joe Malin

Introduction:

 enter image description here

  1. Si nous considérons un fichier apk dans notre mobile, il est composé de plusieurs blocs utiles tels que, par exemple, Activitys, Services et
  2. Ces composants ne communiquent pas entre eux régulièrement et Sans oublier qu’ils ont leur propre cycle de vie. qui indiquent qu'ils peuvent être actifs à un moment et inactifs à un autre moment.

Exigences:

  1. Parfois, nous pouvons avoir besoin d’un scénario dans lequel nous devons accéder à une variable Et à ses états sur l’ensemble de Application, indépendamment de Le Activity utilisé par l’utilisateur
  2. Un exemple est qu’un utilisateur peut avoir besoin d’accéder à une variable qui contient ses informations personnelles .__ (nom, par exemple) auxquelles il doit accéder par l’intermédiaire du Application,
  3. Nous pouvons utiliser SQLite, mais créer un Cursor et le refermer, puis à nouveau N’est pas bon pour la performance,
  4. Nous pourrions utiliser Intents 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.

Utilisations de la classe d'application:

  1. Accès aux variables à travers Application,
  2. Vous pouvez utiliser Application pour lancer certaines opérations, telles que l'analyse Etc. puisque la classe d'application est démarrée avant que Activitys ou Servicess soient en cours d'exécution,
  3. Il existe une méthode remplacée appelée onConfigurationChanged () qui est déclenchée lorsque la configuration de l'application est modifiée (horizontalà la verticale et vice-versa),
  4. Un événement appelé onLowMemory () est également déclenché lorsque Le périphérique Android manque de mémoire.
112
Devrath

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: 

  • Vous pouvez ajouter ce dont vous avez besoin au démarrage de l'application en remplaçant onCreate dans la classe Application.
  • stocker des variables globales qui sautent d’activité en activité. Comme Asynctask.

    etc

62
wtsang02

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

30
IntelliJ Amiya

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.

8
Jon F Hancock

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);
    }
7
Srishti Roy

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.

4
Daniel F

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.

3
Periworks

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.

2
Sir Codesalot

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

1
Vishal Jain

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.

0
taran mahal

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
0
David Maki