有哪几种Context,它们的关系是什么?
总体而言,一共有三种Context,分别是Activity,Service和Application,所以一个应用程序中的Context数量可以等于activity + service + 1(Application)

总体结构如上图所示,Context的关联类使用了装饰模式,优点有下面几个:
- 使用者可以更方便的使用Context
- 如果ContextImpl发生了变化,其装饰类和子类无需做任何修改
- ContextImpl的实现和其使用者相分离
- 通过组合的方式扩展了ContextImpl的功能
Dialog的创建必须使用ActivityContext的原因
在添加Dialog时,WindowManager会检查所使用的activity是否有token,这个token只有Activity才拥有,所以要使用Activity Context来初始化Dialog。
另外,系统的Window是不需要token的,可以设置dialog的window type为系统window,即可以使用Application Context来启动了,需要声明权限。
Application Context启动Activity报错的原因
在目标Activity的启动模式为standard模式下,谁启动了这个Activity,那么目标Activity就会运行在启动它的那个Context所在的栈中。但是Application Context并没有任务栈,所以无法正常启动。
可以为目标Activity指定NEW_TASK的flag,为其创建一个新的任务栈。
网友评论