2011-12-18 88 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(); 
相关问题