“ Context ” 还有什么值得研究?

前言:Context?有什么可看的,不就传个 this 完事儿嘛;诶,还真没那么简单,
从Android系统的角度来理解:Context是一个场景,描述的是一个应用程序环境的信息,代表与操作系统的交互的一种过程。

1. 理解

  1. Context是提供了关于应用环境全局信息的 抽象类
  2. 通过它的对象,才可以获取操作系统或应用的相关资源;

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最主要的功能是加载和访问资源

  1. 启动或停止Activity/Service;

    context.startAtivity();
    context.startService()
    
  2. 发送广播/注册广播接收器;

    registerReceiver();
    sendBroadcast();
    
  3. 加载布局/创建视图对象;

    new EditText(context);
    View.inflate(context, layoutid, null);
    Toast.makeText(context,text,duration);
    
  4. 获取应用环境全局信息;

    |---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. 子类

  1. Activity;

  2. Service;

  3. Application;每个应用只有一个此对象, 单例;

    生命周期:
    	创建---应用启动且其对象不存在(创建应用的进程之后,早于Activity的创建)
    	死亡---应用退出不会销毁Application对象
    	   |--应用的进程被主动或被动杀死时
    
  4. 其它实现;

5. 区别

  1. 不同的功能作用
  2. 生命周期不一样:总体说:Activity生命周期最短,service次之,Application最长。

6. 选择 Activity 还是 getApplicationContext()?

  1. new AlertDialog.Builder(activity):只能使用 activity

  2. View.inflate(activity,…):二者都可,但建议使用 activity

  3. 在地图的集成中:只能使用 ApplicationContext;

  4. Toast.makeText(application/activity):都可以使用

  5. new TextView(activity);二者都可,但建议使用 activity.

  6. 其他情况下,如果使用 activity 会造成内存泄漏的话,建议替换为 application。

    内存泄露:
    内存中申请了一个区域,存放一个对象,但是这个对象不可能再被使用了。
    但是由于一些错误的操作,导致它被引用,且这个引用变量一直都在。
    这样就没办法回收这个对象,不能释放空间。
    但是我又看不到这个变量了,不能再去操作了。
    这块内存就白白占用,但是我又操作不了。这就是泄露。
     
    说明:
    1.一般泄露问题是很难看出来的。很多时候,不会像异常一样抛出来。
    2.如果泄露的内存越来越多,导致内存空间越来越少,最终会导致内存溢出。
    

声明:本博客根据尚硅谷项目实战: 硅谷金融.学习整理;

在这里插入图片描述
加油!奥里给!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章