Android-アクティビティコンストラクターとonCreate


88

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

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


2
Androidがいつでもあなたのアクティビティを破壊/再作成できるという事実はどうですか?そのときコンストラクターが呼び出されるかどうか、またどのコンストラクターが呼び出されるかはわかりません...(同じことがフラグメントにも当てはまります。これが、すべてのフラグメントが空のデフォルトコンストラクターを実装する必要がある理由です)。
マリアンPaździoch

回答:


34

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


73
onCreate()は、finalフィールドを使用できないようにします。
ギリ2012年

2
しかし、OnCreateは一度だけ呼び出されるのではありません、私は間違っていますか?画面の向きを変更して手で戻すと、アクティビティがリロードされるたびに、oncreateが呼び出されます
fercis 2014

2
@fercis onCreateは、インスタンスごとに1回だけ呼び出されると思います。デバイスを回転させると、アクティビティのそのインスタンスが破棄され、onCreateを呼び出して新しいインスタンスが作成されます。とは言うものの、JavaはonCreateが一度だけ呼び出されることを知らないため、onCreateで最終フィールドをインスタンス化できないことは間違いありません(実際、コードで自分で再度呼び出すことができます-悪いことが起こります、ただし、それでもコンパイルされます)。したがって、最終フィールドをインスタンス化する唯一の方法はコンストラクターです。
Harvey Adcock 2016

OnCreateイベントはいつ正確に実行を開始しますか?OnCreateイベントの開始時にブレークポイントを設定して、アプリを実行し、アクティビティを画面にロードすると、ブレークポイントがアクティブになり、アプリが一時停止します。アクティビティが初期化されて起動される直前にアクティブになるアクティビティに関するイベントが必要です。
MohammadAfrashteh18年1

@Cheryl Simon、アクティビティを直接作成することは決してないとおっしゃいましたが、誰がアクティビティを作成しますか?
SreekanthKarumanaghat19年

7

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

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

それは私の理想的な反対ですが、私は活動メンバーの初期化のためのコンストラクタを避け、に依存しているかonResume()onPause()私のアプリが扱っていることのリソースについて。

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

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

  • それらには、適切なタイミング(onResumeまたはonPause)に呼び出す必要のある「close」メソッドがあります。

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

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


1
オブジェクトの寿命が少し長くなるとはどういう意味ですか?私はどうですか?たとえば、これらの初期化をonCreateに移動した場合でも、同じ時間がかかります。私が判断できる寿命に違いはありません。比較的新参者として、ここで重要な何かが欠けているかもしれないと私が感じているので、これについてもう少し詳しく説明していただけますか。
RichieHH 2014年

2
より長いアルキメデスによる@RichieHHは、コンストラクターがonCreate()の前に呼び出されると言っているだけなので、そこで行われることは、アクティビティが破棄されるまでに、そうでない場合よりも(わずかに)長く持続します
pho79 2015

6

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

つまり、コンストラクターを使用すると、継承によって再利用できる「マスターアクティビティ」をシミュレートできます。


15
私はこれが古いことを知っていますが、onCreate()にスーパーフィールドのインスタンス化を実装するだけでなく、ここでの利点は何ですか。とにかく、子からsuper.onCreate()を呼び出すことになります。
アンドリューG

したがって、アクティビティの起動中にバンドルまたはインテントで同じKEYに異なる値を渡し、同じアクティビティを使用するだけで、受け取った値に応じてアクティビティに何を表示するかを決定できます。あなたが建設業者のために行った具体的な理由は何ですか?または、アクティビティの変更されない部分を共通に保ち、変更される部分の残りの部分については、フラグメントを作成することもできます。
Nayanesh Gupte 2014

0

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


1
これについて詳しく説明していただけますか?あなたが説明することは面白そうに聞こえますが、それは少し曖昧です。ありがとう!
2010

3
2つ以上のパラメータをとるカスタムActivityクラスを作成する必要があるとします。コンストラクターを使用する必要があるだけです。onCreateおよびextrasを介してそれを行うことはできません。それは役に立ちますか?
Pentium10 2010

1
プライベートのものが必要かもしれません。カスタマイズされた連絡先ピッカーなどのカスタムコンポーネントを作成するとします。startActivityForResultカスタムコンポーネントにプライベートコンストラクターを含める必要があるため、そのアクティビティが起動されず、可視要素がない場合でも、結果としてforを使用します。
Pentium10 2010

6
コード例がなければ、@ Pentiumには意味がありません。
ブランデル2012年

コンストラクターを介して物事を行うことの利点の1つは、継承されたクラスが利用できるパラメーターを取り込むことができる「テンプレート」アクティビティがあることだと思います。たとえば、R.id.cameraSurface、R.id.videoSurfaceなど、一部のプロパティのみが異なる2つのアクティビティがある場合、AbstractResourceActivityというパラメーターを受け取るコンストラクターを作成すると、CameraActivityが登録されます。リソースIDを渡すAbstractResourceActivityを拡張するマニフェスト。
Archimedes Trajano
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.