我有一个非常简单的代码,在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中可以使用它?
一个简单的例子,很少有类来实现同样的目标,这将是非常值得注意的。
答案 0 :(得分:1)
getApplicationContext()
返回当前进程的单个全局应用程序对象的上下文。
这通常只应在需要生命周期与当前上下文(即您的活动)分开的上下文时使用,该上下文与进程的生命周期而不是当前组件相关联。
例如考虑它如何与registerReceiver(BroadcastReceiver,IntentFilter)交互:
如果从活动上下文使用,则接收者正在该活动中注册。这意味着您需要在活动被销毁之前取消注册;事实上,如果你不这样做,框架将清除你泄露的注册,因为它删除了活动并记录错误。因此,如果您使用Activity上下文来注册一个静态的接收者(该进程是全局的,而不是与Activity实例关联),那么无论您使用的活动被销毁,该注册都将被删除。 如果从此处返回的上下文中使用,则接收器将使用与您的应用程序关联的全局状态进行注册。因此,它永远不会为您注册。如果接收器与静态数据相关联,而不是特定组件,则这是必要的。但是,如果您忘记取消注册,取消绑定等,在其他地方使用ApplicationContext很容易导致严重泄漏。
这段文字来自 getApplicationContext()
;
答案 1 :(得分:0)
不知道你究竟在问什么,但你的MainActivity扩展了Activity,它扩展了一些扩展Context类的其他类,这是你获得getApplicationContext()方法的地方。
根据Context class文档:这是一个抽象类,其实现由Android系统提供。它允许访问特定于应用程序的资源和类,以及应用程序级操作的上调,例如启动活动,广播和接收意图等。