2011-10-07 3 views
43

Dans mon application Android, j'ai une classe DefaultApplication qui s'étend android.app.Application, et dans son onCreate() je lie certains services qui seront utilisés par mes autres activités dans cette application.Quand la méthode onCreate() de l'application est appelée?

J'ai aussi un BroadcastReceiver qui écoute et reçoit des messages C2DM. Lorsque ce récepteur reçoit un message lorsque l'application n'est pas en cours d'exécution, il ouvre une boîte de dialogue qui affiche le message à venir et démarre une activité de mon application.

Ma question est, quand je démarre une activité sans aucune interaction avec DefaultApplication, est-ce que DefaultApplicationonCreate() sera appelée parce qu'une activité de cette application a commencé?

Voici la définition et Manifest de mon DefaultApplication:

public class DefaultApplication extends Application { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 

     doBindService(); 

    } 

    void doBindService() { 

     // Establish a connection with the service. We use an explicit 
     // class name because we want a specific service implementation that 
     // we know will be running in our own process (and thus won't be 
     // supporting component replacement by other applications). 

     bindService(new Intent(DefaultApplication.this, SocketService.class), 
       socketServiceConnection, Context.BIND_AUTO_CREATE); 

     mIsBound = true; 
    } 

    void doUnbindService() { 
     if (mIsBound) { 
      // Detach our existing connection. 
      unbindService(socketServiceConnection); 
      mIsBound = false; 
     } 
    } 
} 

Manifest ressemble à ceci:

<application android:icon="@drawable/icon" android:label="@string/app_name" 
     android:name="com.mypackage.DefaultApplication" 
     android:theme="@android:style/Theme.NoTitleBar.Fullscreen" 
     android:debuggable="true"> 
<service android:name="com.mypackage.services.SocketService"></service> 
<activity android:name="TestActivity" 
      android:screenOrientation="landscape"></activity> 
</application> 
+1

oui, cela fonctionne, je ne l'ai pas vu un autre autre ... – atasoyh

+0

je ne sais pas pourquoi unserstand vous étendez 'Application'? Ne devriez-vous pas étendre «Activité»? – Caner

+0

@LAS_VEGAS Dans le reste de mon DefaultApplication, je stocke des données et définit certaines méthodes qui sont utilisées à l'échelle de l'application. Je n'en ai copié qu'une partie ici. –

Répondre

40

Seulement la première fois.

Lorsque l'activité est démarrée et que l'application n'est pas chargée, les deux méthodes onCreate() sont appelées. Mais pour les démarrages ultérieurs d'activité, l'application onCreate() ne sera pas appelée.

+0

Pas strictement vrai. [La réponse de Paul explique un peu plus, y compris un lien utile.] (Http://stackoverflow.com/a/28498115/383414) –

28

Vous pouvez trouver une réponse officielle quand onCreate est appelé here.

Appelée au démarrage de l'application, avant toute activité, service, ou objet récepteur (à l'exception des fournisseurs de contenu). Les implémentations doivent être aussi rapides que possible (par exemple en utilisant initialisation d'état paresseux) puisque le temps passé dans cette fonction affecte directement les performances de démarrage de la première activité, service , ou récepteur dans un processus. Si vous remplacez cette méthode, appelez pour appeler super.onCreate().

Questions connexes