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方法中

你可能感兴趣的:(Activity和Application的Context有何区别,两者在使用上有何不同?)