2011-10-07 31 views
43

私のAndroidアプリケーションでは、android.app.Applicationを拡張する​​クラスがあり、そのonCreate()には、このアプリケーションで他のアクティビティで使用されるいくつかのサービスがバインドされています。アプリケーションのonCreate()メソッドはいつ呼び出されますか?

また、BroadcastReceiverは、C2DMメッセージをリッスンして受信します。このレシーバーは、アプリケーションが実行されていないときにメッセージを受信すると、次のメッセージを表示するダイアログを起動し、アプリケーションのアクティビティーを開始します。

私の質問は、​​とのやりとりなしでアクティビティを開始したとき、私の​​のonCreate()は、そのアプリケーションのアクティビティが開始されたために呼び出されますか?ここで

は私​​の定義とマニフェストです:onCreatehere呼び出されたときに

<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

はい、それはこの作品、私は別の他のを見ていない... – atasoyh

+0

を参照してください私はunserstandませんか?あなたは 'Activity'を拡張するべきではありませんか? – Caner

+0

@LAS_VEGAS残りのDefaultApplicationでは、いくつかのデータを保存し、アプリケーション全体で使用されるいくつかのメソッドを定義します。私はその部分だけをここにコピーした。 –

答えて

40

初回のみ。

アクティビティが開始され、アプリケーションがロードされていない場合は、onCreate()メソッドが呼び出されます。

アクティビティのそれ以降の起動では、アプリケーションのonCreate()は呼び出されません。

+0

厳密には当てはまりません。 [ポールの答えは役に立つリンクを含む、もう少し説明します。](http://stackoverflow.com/a/28498115/383414) –

28

あなたは公式の答えを見つけることができます。

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; 
     } 
    } 
} 

マニフェスト次のようになります。

アクティビティ、サービス、 または受信者オブジェクト(コンテンツプロバイダを除く)が作成される前に、アプリケーションの起動時に呼び出されます。 は、最初のアクティビティの開始、プロセス内の サービス、または受信者のパフォーマンスに直接影響するため、できるだけ早く実行する必要があります(たとえば、遅い 状態の初期化を使用)。このメソッドをオーバーライドする場合は、 super.onCreate()を必ず呼び出してください。

9

サービスが他のプロセスで実行されるように定義されている場合などに注意してください。 android:process=とすると、そのプロセスに対してApplicationのonCreate()が再び呼び出されます。あなたは `Application`を延長する理由例えば

Android Application class method onCreate being called multiple times

関連する問題