Activity和Application的Context有何区别,两者在使用上有何不同?

Activity和Application的Context有何区别,两者在使用上有何不同?
首先说一下Context,Context是一个抽象类,其中对他的实现类有ContextWrapper,ContextImpl,ContextThemeWrapper,其中Application和Service是继承自ContextWrapper,而Activity是继承自ContextThemeWrapper。
网上也有一个典型的问题,在用Dialog时,为什么一定要用Activity的Context而不能用Application的Context,经查源码看,因为在View的创建上,它需要传递一个token,需要继承自ContextThemeWrapper才会生成这个token,而Application和service继承自ContextWrapper,这个token的值为null。

context是Application,实际调用的是ContextImpl.getSystemService,获取的WM是new WindowManagerImpl(display),即mParentWindow为null;
context是Activity,获取的WM是new WindowManagerImpl(mDisplay, parentWindow),这个parentWindow就是Activity里的PhoneWindow,且这个PhoneWindow设置了mAppToken。
在创建dialog时,如果传入构造方法不是一个activity类型的上下文,则导致WindowManagerImpl类型为Window的变量mParentWindow为null,从而导致WindowManagerGlobal的addView不会调用Window的adjustLayoutParamsForSubWindow方法,从而不会给attr.token赋值,导致在WindowManagerService服务中的身份验证失败,抛出BadTokenException异常。
可以看到只有parentWindow不为空才会走到adjustLayoutParamsForSubWindow方法中

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容