2011-12-18 9 views
3

アンドロイドにコンストラクタを実装する正しい方法は何ですか?アンドロイド、特にアプリケーションコンテキストでコンストラクタを実装する正しい方法は何ですか?

アクティビティやサービスでは、 'onCreate()'はマジックが起こる場所です。

なぜ私は、私のクラス(特にコンテキスト)の先頭にある 属性を宣言し、次にonCreate内に属性値を設定することを正しいことをしたいと思っているからです。

// Activity launched via an Intent, with some 'extras' 
public class SomeActivity extends Activity { 

    private Context context; 
    private String foo; 

    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Set the object attribute for later use, good or Bad to do this? 
     context = getApplicationContext(); 
     Intent fooIntent = getIntent(); 
     foo = fooIntent.getStringExtra("foo"); 
    } 

    private void someMethodThatNeedsContext() { 
     // For example: 
     Cursor c = this.context.getContentResolver().query(foo, xxx, xxx); 
     // Or is it better practice to: 
     // A) Pass the context as a local variable to this method 
     // B) Use getApplicationContext() locally when needed 
    } 
} 

多分これらのオプションのいずれかがOKであり、私はそれを考えていますか? あなたが持っている具体的な読書や提案は、私にとって大きな助けになります。

+1

* getApplicationContext()を使用している理由がわからないかぎり、 'getApplicationContext()'を使わないでください。それはめったに必要ありません。 – CommonsWare

+0

素晴らしい提案、私はあなたがマークからどのくらい迅速に信じることができません! – camstuart

答えて

1

オプションB - アクティビティクラスの非スタティックメソッドからgetApplicationContext()を呼び出すことができます。 は実際には、活性は(..継承ツリー内のどこかに)あまりにもコンテキストから派生しているので、あなただけ行うことができます。

Cursor c = getContentResolver().... 

あなたはコンテキストへの参照を保持する必要はありません。 特に、は静的ではないため、問題が発生する可能性があります。

あなたは正しいです - あなたは通常、アクティビティ用に独自のコンストラクタを作成しないので、建設コードをonCreateに入れます。

1

あなたはどこでもあなたのコード内でgetApplicationContext()を呼び出すことができますので、あなたはローカル変数を使用する必要はありません、あなたの活動の内部でメソッドを書いている:

Cursor c = getApplicationContext().getContentResolver().query(foo, xxx, xxx); 

また、活動自体であることを覚えておいてくださいコンテキスト(ActivityクラスはContextから派生しています)ですので、コンテキストを提供する必要があるときはいつでも(new Intent(this, ...))、thisを使用できます。

+0

私は、getApplicationContextの呼び出しによって追加のオーバーヘッドが発生しているのではないかと心配していますが、特定のリソースを必要としない単純なゲッターのように聞こえますか? – camstuart

+0

あなたはそうです、それはほとんどオーバーヘッドのないゲッターです。 – Dalmas

2

はい、初期化はonCreate()で行われるはずです。コンテキストへの参照を格納するのにも、getApplicationContext()にも呼び出す必要はありません。あなたの活動はコンテキスト自体であるなので、コンテキストが必要な場所であればどこでも使えます。たとえば、アクティビティ内で乾杯をする:

Toast.makeToast(this, "Some text", Toast.LENGTH_LONG).show(); 
関連する問題