Context相信大多数安卓开发者每天都有接触,但这并不意味着编辑很少和大家分享。 今天学习一下你今天不知道的细节吧。 一起和爱站技术频道的编辑一起学习吧。
区别联系:
复制代码就是:
publicclassmyactivityextendsactivity {
公共语音方法
mContext=this; //since活动扩展上下文
mContext=getApplicationContext (;
mContext=getBaseContext (;
}
}
this是活动的实例,扩展了上下文,其生命周期从创建到销毁活动
getApplicationContext ) )返回到APP应用程序的上下文,生命周期是整个APP应用程序,只有在APP应用程序被破坏后才会被破坏
Activity.this的上下文返回到当前的activity上下文,属于activity,如果activity破坏他,则会被破坏
getBaseContext ()返回在构造函数中指定的上下文或setBaseContext () )中设置的上下文。 因为SDK文档很少,所以不推荐
明确生命周期后,在使用中会发生错误。 例如,如果有使用context的全局数据操作类,则必须使用getApplicationContext而不是ACtivity。 这可以确保数据库操作与活动无关。 (
应用场景:
例如activity oncreate :
复制代码就是:
保护性语音创建(绑定状态) {
super.oncreate(state;
textviewlabel=newtextview(this; 将上下文传递给view控制
label.settext(leaksarebad );
setcontentview (标签;
}
将activity context传递给view意味着view具有对activity的引用,并且引用了activity占用的资源: view hierachy、resource等。
当context以这种方式发生内存泄漏时,会发生很多内存泄漏。 这里泄露的意思是gc未能回收活动的内存。
学习和企业活动是一件简单的事情。 屏幕旋转时,系统将销毁当前活动,保存状态信息,并创建新的活动。
例如,我写了一个需要加载大图片的APP应用程序。 我不想在每次旋转屏幕时放弃并重新加载此图像。
实现这一请求的简单想法是定义静态Drawable,以便Activity类创建并销毁它,并始终存储在内存中。
示例实现:
复制代码就是:
publicclassmyactivityextendsactivity {
私密性后台客户端;
保护性语音创建(绑定状态) {
super.oncreate(state;
textviewlabel=newtextview(this;
label.settext(leaksarebad );
if (后台==null ) {
sbackground=get drawable (r.drawable.large _ bitmap );
}
label.setbackgrounddrawable (sbackground; //drawable attached to a view
setcontentview (标签;
}
}
这个步骤看起来很简单,但问题很大。 画面旋转后有leak。 也就是说,gc无法销毁活动。
正如我刚才说的,当屏幕旋转时,系统将放弃当前的活动。 但是,将drawable与view关联后,drawable保存了view的引用,即后台保存了对label的引用,而label保存了对activity的引用。
因为不能销毁drawable,所以不能销毁引用对象,也不能销毁间接引用对象。 因此,系统无法销毁当前活动,并且会发生内存泄漏。 gc对这种类型的内存泄漏无能为力。
为了避免这种内存泄漏,activity中的对象的生命周期必须长于activity,并且从对象到activity的引用不能成功销毁activity。
我们可以使用应用程序上下文。
应用程序上下文伴随应用程序的一生,与活动的生命周期无关。
可以通过Context.getApplicationContext ()或Activity.getApplicationContext ) )获得应用程序上下文。
要避免与上下文相关的内存泄漏,请注意以下事项:
1 .防止生命周期较长的对象引用活动上下文。 也就是说,它确保引用活动的对象与活动自身的生命周期相同
2 .生命周期较长的对象可以使用应用程序上下文
3 .避免非静态内部类,尽量使用静态类,避免生命周期问题,注意内部类引用外部对象导致的生命周期变化
使用爱站技术频道主编介绍的android基础教程内容进行详细说明,相信大家在一定程度上已经理解了。 要了解更多信息,请继续关注爱站技术频道。