2011-12-18 75 views
3

什麼是在android中實現構造函數的正確方法?在android,application context中實現構造函數的正確方法是什麼?

看來,在活動或服務'onCreate()'是魔術發生的地方。

我問的原因是因爲我想確保我做的是正確的事情,在我的類的頂部聲明 屬性(特別是Context),然後在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 
    } 
} 

也許這些選項中的任何一個都可以,我想過了嗎? 任何具體的閱讀和/或建議,你可能會對我很有幫助。

+1

不要使用'getApplicationContext()',除非你知道*爲什麼*你正在使用'getApplicationContext()'。這是不常需要的。 – CommonsWare 2011-12-18 15:51:48

+0

偉大的建議,我不能相信你們有多快速脫穎而出! – camstuart 2011-12-18 16:00:41

回答

1

選項B - 因爲您可以從Activity類中的任何非靜態方法調用getApplicationContext()。 事實上,活動是從上下文推導太(某處在繼承樹..),所以你可以這樣做:

Cursor c = getContentResolver().... 

你不必保持到上下文的參考。 尤其是不是靜態的,可能會導致問題。

而且你是對的 - 因爲你通常不會爲活動創建自己的構造函數,所以你把施工代碼放在onCreate

1

您正在撰寫的活動裏面的方法,這樣你就可以在你的代碼的任何地方撥打getApplicationContext(),你不需要使用本地變量:

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

還記得那活動本身一個上下文(Activity類從Context派生),所以一般情況下,只要需要提供上下文(例如,在創建Intent時:new Intent(this, ...)),就可以使用this

+0

有道理,我想我的擔心是通過調用getApplicationContext來增加額外開銷,但它聽起來像是一個簡單的getter,不需要任何特定的資源? – camstuart 2011-12-18 15:41:54

+0

你是對的,它只是一個幾乎沒有開銷的吸氣器。 – Dalmas 2011-12-18 15:44:23

2

是的,你是正確的初始化應該發生在onCreate()。您並不需要既不存儲對上下文的引用,也不需要致電getApplicationContext()。你的活動上下文本身,所以你只要在需要上下文的地方使用。例如,在一個活動中做一個烤麪包:

Toast.makeToast(this, "Some text", Toast.LENGTH_LONG).show(); 
相關問題