context:
Context实例个数 = Service个数 + Activity个数 + 1(Application对应的Context实例)
1、它描述的是一个应用程序环境的信息,即上下文;也可以理解成“运行环境”:它提供了一个应用运行所需要的信息,资源,系统服务等;同样可以理解成,用户操作和系统交互这一过程就是一个场景,比如Activity之间的切换,服务的启动等都少不了Context。
2、该类是一个抽象(abstract class)类。
Application:
创建Application 对象时, 而且整个App共一个Application对象
getApplicationContext()返回的是你的整个Application的context,生命周期是整个Application,Application销毁后,它才销毁。
getBaseContext()返回由构造函数指定或者setBaseContext()设置的上下文(谷歌工程师不建议使用)。
所以application的生命周期就是整个程序的生命周期,程序完全退出application才销毁。
activity与View
window,activity,和view的关系是这个样子的:
activity中new出一个window,而window(接口)通过这个phonewindow子类来获取一个子类实例。这是一种典型composite模式。再通过
phonewindow的setContentView在内部使用LayoutInflater来给Window设置View。
这段话给我们的感觉就是 activity是窗口(界面),View是显示在窗口的布局
this和activity.this
Activity.this的context属于Activity,生命周期与Activity相同,随着当前的Activity.this消亡而消亡。
this是你当前对象的引用,this放在哪里边就是谁的指针,如果在Activity中就是Activity,这时等同于Activity.this;如果放在OnCliclListener()中就是OnClickListener()。
activity.this的生命周期就是当前的页面,当前页面销毁掉了,activity也就被销毁,另外this指当前对象,在实际开发工程中有的需要自己指明是哪个activity的对象,要不然编译不通过。
看下他们之间的结构图
从这几个图可以看出 context是一个大的窗口(界面),这个界面的下一级别是 application 再下一级别是 activity.... ,cointext是这几个类的父类,
同样的布局View是所有layout布局中控件的父类。 context和View一个管理窗口一个管理布局显示。
3.Context应用场景
虽然Application,Activity,Service的祖先都是Context,并不是每个Context对象都是相同的。
- Application:一个应用在创建的时候只会创建一个ActivityThread主线程,而在初始化ActivityThread主线程的时候就会创建一个Application对象。Application是全局的,在Activity和Service里都可以调用getApplication方法来获得一个应用的Application对象。Application的父类是ContextWrapper类。
- **Service:**Service父类是ContextWrapper,一个应用每创建一个Service,都会创建一个ContextImpl类去关联Service。
- **Activity:**Activity父类是ContextThemeWrapper,而ContextThemeWrapper父类是ContextWrapper。ContextThemeWrapper类是其父类的扩张,里面额外添加了关于主题设置的一些方法。在ActivityThread主线程中创建Activity的时候我们知道,创建完了Activity之后会立马调用Activity#setTheme设置Activity的主题。
不同Context的应用场景如下图标
功能 | Application | Service | Activity |
---|---|---|---|
Start an Activity | NO1 | NO1 | YES |
Show a Dialog | NO | NO | YES |
Layout Inflation | YES | YES | YES |
Start a Service | YES | YES | YES |
Bind to a Service | YES | YES | YES |
Send a Broadcast | YES | YES | YES |
Register BroadcastReceiver | YES | YES | YES |
Load Resource Values | YES | YES | YES |
4.Activity Window View之间的三角关系
我们打开IDE创建一个Activity,IDE会自动帮我们生成一些代码,然后一个空的Activity界面就展示出来了。这一看似简单的问题,实则包含了很多内容,这一过程包含了Activity Window View三者之间复杂的三角关系,在这一流程中Activity是整个模型的控制单元,Window属于承载模型,负责承载视图,View是视图显示模型。
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
参考链接 http://blog.csdn.net/feiduclear_up/article/details/47356289
http://www.jianshu.com/p/a533467f5af5