现在算下来,在互联网公司已经实习两个月了,这两个月收获颇丰,有很多很多的东西值得去记。(嗯,绝对不是偷懒。干货都记本地了,等总结好了再发博客)
近期我准备开一个坑,就是写《Android开发须知》这个系列。因为在实习过程中,我发现在Android开发过程中有许多很小却很常见的“深坑”。不说是初来乍到的应届生,很多老司机会在这些地方翻车。写这个系列博客 一来,告诫自己在开发中要谨记这些小事情,避免犯错。二来,就是与各位准备开发Android的小伙伴进行探讨,避免踩坑。
言归正传,咋们从最常见的问题开始
Context开始讲起
什么是Context?Android为什么要用context?是我初学Android的困惑。
Context被翻译为“上下文”。这个概念表面看上去通俗易懂,实际上是“一万人就有一万个哈姆雷特”。在这里我表述一下我对context的看法,context就是一个Android系统的高级凭证,重要的类都必须拿凭证打开,不是什么阿猫阿狗都可以随便new出来的。就比如启动一个ACtivity:
Intent intent = new Intent(context, MainActivity.class);
context.startActivity(intent);
出于安全考虑,Android系统是不允许Activity凭空出现的。也就说,要持有context凭证才能去启动一个Activity。保证安全的、正确的开启下一个重要组件。
除了启动Android的四大组件以外,通过context还可以访问APK中的各种资源,访问Package的相关信息和各种权限管理。
比如去获取个版本名称
PackageManager pm = context.getPackageManager();
PackageInfo pi=pm.getPackageInfo(context.getPackageName(), 0);
pi.versionName
Context的生命周期
铺垫完了,今天我们的两个主角登场:Activity context与Application context。
我们先来看一个Demo
public class Demo{
private static Demo instance;
private Context context;
private Demo(Context context){
this.context=context;
}
public getDemoInstance(Context context){
if(instance == null){
instance=new Demo(context)
}
return instance
}
}
这是一个很简单的单例模式,单例模式的特殊性让它的生命周期和Application一样长,如果开始就传入一个Activity context,那么当这个Activity被销毁后,这个单例依然引用着它的context,使得Activity无法GC,导致内存泄漏。
Activity context跟Activity的生命周期是相关的,Activity可以销毁几次(反复开启),那么属于Activity的context就会销毁多次
而Application context的生命周期与Application相同,context随着Application的销毁而销毁,伴随application的一生。并与activity的生命周期无关.可以通过Context.getApplicationContext或者Activity.getApplication方法获取。
所以Context的生命周期不同,决定了context的使用不同。
Context的用法
1.把控context的生命周期:
使用context,要先明确使用的context生命周期长短。如果是工具类获取一些信息,就使用Application Context解决问题。如果是启动一个Activity就使用Activity context。
2.及时释放context:
如果我们必须使用Activity context让其他类持有,那么一定要记得在Activity的onDestroy()时或之前把给出的context置空。避免让“闲杂人等”长期持有。
网友评论