用户定义类中的Android Context对象引用

时间:2015-01-29 09:32:12

标签: android android-activity reference android-context

我有一个非常简单的代码,在Toast点击时显示Button条消息

public class MainActivity extends Activity {

Button clickMe;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    clickMe = (Button) findViewById(R.id.button1);
    clickMe.setOnClickListener(new OnClickListener() {

        @Override
        public void onClick(View v) {
            Toast msg = Toast.makeText(getApplicationContext(), "Hello World !", Toast.LENGTH_LONG);
            msg.show();
        }
    });
}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    // Inflate the menu; this adds items to the action bar if it is present.
    getMenuInflater().inflate(R.menu.main, menu);
    return true;
    }
  }

我想知道我是如何能够仅仅通过调用

来引用Context对象的
getApplicationContext()

Toasts' makeText方法中,因为我从未实例化过Context(我无论如何都不是因为它是抽象的),也不是它的子类。

任何人都可以在创建参考文献的时间(或在何处)向我解释,以及我的班级MainActivity中可以使用它?

一个简单的例子,很少有类来实现同样的目标,这将是非常值得注意的。

2 个答案:

答案 0 :(得分:1)

getApplicationContext()返回当前进程的单个全局应用程序对象的上下文。

这通常只应在需要生命周期与当前上下文(即您的活动)分开的上下文时使用,该上下文与进程的生命周期而不是当前组件相关联。

例如考虑它如何与registerReceiver(BroadcastReceiver,IntentFilter)交互:

如果从活动上下文使用,则接收者正在该活动中注册。这意味着您需要在活动被销毁之前取消注册;事实上,如果你不这样做,框架将清除你泄露的注册,因为它删除了活动并记录错误。因此,如果您使用Activity上下文来注册一个静态的接收者(该进程是全局的,而不是与Activity实例关联),那么无论您使用的活动被销毁,该注册都将被删除。 如果从此处返回的上下文中使用,则接收器将使用与您的应用程序关联的全局状态进行注册。因此,它永远不会为您注册。如果接收器与静态数据相关联,而不是特定组件,则这是必要的。但是,如果您忘记取消注册,取消绑定等,在其他地方使用ApplicationContext很容易导致严重泄漏。

这段文字来自 getApplicationContext();

的文档

答案 1 :(得分:0)

不知道你究竟在问什么,但你的MainActivity扩展了Activity,它扩展了一些扩展Context类的其他类,这是你获得getApplicationContext()方法的地方。

根据Context class文档:这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及应用程序级操作的上调,例如启动活动,广播和接收意图等。