16

これを1つの包括的な質問に変えるために一生懸命努力します:

私は、Android デバイスの都市の名前を含む文字列を取得するメソッドを作成してLocationManagergetLastKnownLocation()ます。

その後、別のアクティビティで同じことを再度行う必要があることに気付きましたLocationFinder。では、どこにでも重複するコードを記述するのではなく、プログラム全体で使用できる完全に別のクラス ( ) を作成してみませんか?

しかし、私を混乱させる問題に遭遇しました。たとえば、このクラス ( LocationFinder) を作成した場合、実際には視覚化されていなくても、Activity を拡張する必要がありますか? getLastKnownCity()このクラスが行うことは、 orgetCurrentCity()および戻り文字列のようなさまざまな getter を持つことだけです。実際にはアクティビティではないため、Activity クラスを拡張する必要はないと思いました。

しかし、次にどのコンテキストを使用しますか:

Geocoder geocoder = new Geocoder(Context context, Locale locale)

?

これは私にそれが活動でなければならないと思い込ませました。そこで、Activity を拡張し、コンストラクターを次のように置き換えました。

@Override
protected void onCreate(..............

しかし、どういうわけか、私が入れても、それは決して呼び出されません

String city = new LocationFinder().getLastKnownCity();

の最初のLocationFinderonCreate()

System.out.println("HEY!")

そして、それは決してそれに到達することさえありません。ヌルポインターandroid.internal.os.LoggingPrintStream.println()などを取得します。

さらに、Activity クラスに由来するシステム定数が多数あります。たとえばLOCATION_SERVICE、文字列である at を取得する必要がありますが、Activity を拡張しないと取得できません。確かに、ごまかしてリテラル文字列を挿入することもできますが、それは間違っていると感じます。

4

3 に答える 3

5
should it extend Activity, even though it is never actually visualized?

いいえ。Androidドキュメントから

アクティビティとは、ユーザーが実行できる単一の焦点を絞ったものです。ほとんどすべてのアクティビティはユーザーと対話するため、Activity クラスは setContentView(View) を使用して UI を配置できるウィンドウを作成します。

アクティビティは、ユーザーに表示される画面と考えてください。

しかし、Geocoder geocoder = new Geocoder(Context context, Locale locale) に使用するコンテキストは何ですか?

このActivityクラスはContext、 を含む他の多くのクラスと同様に拡張されますApplicationコンテキストは、コンテキストを拡張するクラスに関連付けられたリソースへのアクセスを提供します。

Activity コンテキストは、その Activity に関連付けられたリソースおよび具体的な Activity クラスによって実装されたメソッドと対話する必要がある場合にのみ必要であり、使用する必要があります。そのコンテキストへのアクセスが必要な場合は、通常、そのクラスのコンストラクターへの引数として、アクセスが必要なクラスにそれを渡します。

アクティビティを拡張するアクティビティの外部でアクティビティ コンテキストを渡す場合は、参照のスコープとライフサイクルが拡張するアクティビティ以下であることを確認してください。コンテキストへの参照があるため、コレクタはメモリを解放できません。

Geocoder のコンストラクターを見ると、ご存じのように、Context を引数として取ることがわかります。説明にコンテキストが必要な理由についての手がかりがあります。

     Geocoder(Context context, Locale locale)
Constructs a Geocoder whose responses will be localized for the given Locale.  [1]: 

Context が必要な理由は、プラットフォーム ロケールと現在のシステム ロケールに関するシステム情報にアクセスするためです。

したがって、あなたの例では、 Application コンテキストをコンストラクターに渡すだけで、参照を取得できますgetApplicationContext()

たとえば、Activity を拡張しないと取得できない文字列である LOCATION_SERVICE を取得する必要があります。

アプリケーションコンテキストから取得できます。

于 2013-07-03T07:11:51.400 に答える