web-dev-qa-db-ja.com

Android-Activity Constructor vs onCreate

Android Activitiesには特定のライフサイクルがあり、onCreateをオーバーライドして初期化に使用する必要があることを理解していますが、コンストラクターで実際に何が起こるか? Activityコンストラクタもオーバーライドできる/すべきである場合、または決して触れてはいけない場合

Activitiesへの参照は完全にクリーンアップされないため(したがって、ガベージコレクターを妨害するため)、コンストラクターは使用しないで、onDestroyはその目的のためにあると想定しています。これは正しいです?

81
idolize

コンストラクターで何かを行う正当な理由は考えられません。アクティビティを直接構築することはないため、それを使用してパラメータを渡すことはできません。通常、onCreateで操作を行います。

32
Cheryl Simon

ギリのコメントが述べたように、コンストラクターに物事を入れる正当な理由は、最終フィールドの使用です。

ただし、コンストラクターで初期化すると、オブジェクトの寿命が少し長くなりますが、onCreateはその後すぐに呼び出されるため、あまり考えていません。

それは私の理想に反しますが、アクティビティメンバの初期化のコンストラクタを避け、アプリが処理するリソースのonResume()onPause()に依存しています。

onCreate()の場合、通常はローカル変数へのビューマッピングを行うために使用します。 Androidアノテーションは既にそれを行っているので、アクティビティにonCreate()メソッドを使用することはめったにありません。私はまだサービスでそれを使用しています。

ただし、メンバーを見ると、初期化されている可能性があります

  • 適切なときに呼び出す必要がある「close」メソッドがあります(onResumeまたはonPause)

  • これらはビューの一部になります。つまり、初期化する必要があり、onCreateを呼び出す必要があります。

  • とにかくコンストラクターに入れる必要のない定数であり、静的なファイナルだけで十分です。これには、静的ブロックによって初期化できるペイント定数とパス定数が含まれます

7

私は今、コンストラクタをオーバーライドする必要があるケースにいます。実際、同じ構造のアクティビティがいくつかあります。したがって、多くのアクティビティを作成する代わりに、1つの「マスター」アクティビティを作成し、他のアクティビティはこのアクティビティを継承します。したがって、oncreateメソッドで使用されるいくつかの変数を初期化できるように、子アクティビティのコンストラクターをオーバーライドする必要があります。

言い換えれば、コンストラクターは、継承によって再利用できる「マスターアクティビティ」をシミュレートさせます!

6
biboMandroid

アクティビティにカスタムパラメータがある場合、または継承元のクラスからの呼び出しを追跡する場合は、コンストラクタをオーバーライドする必要があります。

0
Pentium10