在android,特别是应用程序上下文中实现构造函数的正确方法是什么?

时间:2011-12-18 15:35:55

标签: android constructor android-context

在android中实现构造函数的正确方法是什么?

似乎在一个活动或服务中'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
    }
}

也许这些选项中的任何一个都可以,我在想它? 您可能拥有的任何具体阅读和/或建议都会对我有所帮助。

3 个答案:

答案 0 :(得分:2)

是的,你应该在onCreate()进行初始化是正确的。您既不需要存储对上下文的引用,也不需要调用getApplicationContext()。您的活动 是一个上下文本身,因此您只需在需要上下文的地方使用。例如,在活动中做一个祝酒词:

Toast.makeToast(this, "Some text", Toast.LENGTH_LONG).show();

答案 1 :(得分:1)

您正在活动中编写方法,因此您可以在代码中的任何位置拨打getApplicationContext(),而不需要使用本地变量:

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

还要记住,活动本身一个上下文(Activity类派生自Context),因此通常您可以在需要时使用this提供上下文(例如在创建Intent时:new Intent(this, ...))。

答案 2 :(得分:1)

选项B - 因为您可以从Activity类中的任何非静态方法调用getApplicationContext()。 实际上,Activity也是从Context派生的(继承树中的某个地方......)所以你可以这样做:

Cursor c = getContentResolver()....

您不必保留对上下文的引用。 特别是不是静态的,可能会导致问题。

你是对的 - 因为你通常不为活动创建自己的构造函数,所以你将构造代码放在onCreate中。