对 “ Context ” 理解的深入浅出
前言:Context?有什么可看的,不就传个 this 完事儿嘛;诶,还真没那么简单,
从Android系统的角度来理解:Context是一个场景,描述的是一个应用程序环境的信息,代表与操作系统的交互的一种过程。
1. 理解
- Context是提供了关于应用环境全局信息的 抽象类;
- 通过它的对象,才可以获取操作系统或应用的相关资源;
2. 使用“ Context ”的两个场景
1. 调用 Context 下的相关方法
startActivity();
startService();
sendBroadcast();
getAssets();
getSystemService();
getContentResolver();
getPackageManager();
openFileInput()/openFileOutput();
getFilesDir()/getExternalFilesDir();
registerReceiver();
2. 将context作为实参传入
Toast.();
view.inflate();
new TextView();
new alertDialong.builder();
3. context最主要的功能是加载和访问资源
-
启动或停止Activity/Service;
context.startAtivity(); context.startService()
-
发送广播/注册广播接收器;
registerReceiver(); sendBroadcast();
-
加载布局/创建视图对象;
new EditText(context); View.inflate(context, layoutid, null); Toast.makeText(context,text,duration);
-
获取应用环境全局信息;
|---Context getApplicationContext(); |---Application activity.getApplication() getApplicationInfo(); getContentResolver(); getPackageManager(); getPackageName(); getResources(); getAssets(); getSharedPreferences(); String getString(int id); getSystemService();
注;对于第一、二行解释:
1.Application对象的创建要早于所有的Activity对象的创建 2.Context :getApplicationContext() 和 Activity:getApplication():返回的都是pplication对象 3.Application的实例,随着应用加载到内存中,此对象创建,方法调用。只要当前的进程存在,此对象就存在。(单例)如果进程销毁,此对象销毁。。 4.Application实例的生命周期要早于所有的其他组件。销毁不早于其他组件。 5.application可以看成:应用全局数据内存级共享容器。(-->生命周期长,并且各个组件都可以调用,故可以进行事件传递)
4. 子类
-
Activity;
-
Service;
-
Application;每个应用只有一个此对象, 单例;
生命周期: 创建---应用启动且其对象不存在(创建应用的进程之后,早于Activity的创建) 死亡---应用退出不会销毁Application对象 |--应用的进程被主动或被动杀死时
-
其它实现;
5. 区别
- 不同的功能作用
- 生命周期不一样:总体说:Activity生命周期最短,service次之,Application最长。
6. 选择 Activity 还是 getApplicationContext()?
-
new AlertDialog.Builder(activity):只能使用 activity;
-
View.inflate(activity,…):二者都可,但建议使用 activity
-
在地图的集成中:只能使用 ApplicationContext;
-
Toast.makeText(application/activity):都可以使用
-
new TextView(activity);二者都可,但建议使用 activity.
-
其他情况下,如果使用 activity 会造成内存泄漏的话,建议替换为 application。
内存泄露: 内存中申请了一个区域,存放一个对象,但是这个对象不可能再被使用了。 但是由于一些错误的操作,导致它被引用,且这个引用变量一直都在。 这样就没办法回收这个对象,不能释放空间。 但是我又看不到这个变量了,不能再去操作了。 这块内存就白白占用,但是我又操作不了。这就是泄露。 说明: 1.一般泄露问题是很难看出来的。很多时候,不会像异常一样抛出来。 2.如果泄露的内存越来越多,导致内存空间越来越少,最终会导致内存溢出。
声明:本博客根据尚硅谷项目实战: 硅谷金融.学习整理;
加油!奥里给!