遇到這么個(gè)問題:
兩個(gè)應(yīng)用以相同的方式new一個(gè)控件,但是顯示的樣式卻不一樣质欲,最后追溯代碼郭脂,最終定位到原來傳入的context不一樣,一個(gè)為Activity的橘茉,另一個(gè)是Application的工腋。
一、Context是什么畅卓?
語境夷蚊、上下文,即環(huán)境的信息或者場(chǎng)景髓介,它的實(shí)現(xiàn)是由Android系統(tǒng)提供的惕鼓,訪問app的資源,啟動(dòng)activity唐础,獲取系統(tǒng)服務(wù)箱歧,創(chuàng)建View等都會(huì)牽扯到Context。
二一膨、Context創(chuàng)建
1呀邢、創(chuàng)建Application時(shí)會(huì)創(chuàng)建一個(gè)ApplicationContext,生命周期跟隨應(yīng)用走,當(dāng)Application被摧毀時(shí)Context才被摧毀豹绪。?
2价淌、創(chuàng)建Activity時(shí)會(huì)創(chuàng)建一個(gè)Activity的Context,生命周期跟隨Activity瞒津。?
3蝉衣、創(chuàng)建Service時(shí)創(chuàng)建Service的Context,生命周期跟隨Service巷蚪。
Context的總數(shù) = Activity(個(gè)數(shù))+Service(個(gè)數(shù))+1個(gè)Application的Context病毡。
三、獲取Context
1屁柏、getContext()啦膜;?
2有送、getBaseContext();?
3、getApplicationContext();?
4僧家、this;
四種方法獲取的Context如下:
通過View.getContext()和Activity.this其實(shí)時(shí)相同的雀摘,getBaseContext獲取到的是ContextImpl的,getApplicationContext獲取的是Application的八拱。
四届宠、通過Context獲取資源
最常見的方法就是getContext().getResource(),通過這個(gè)方法可以獲取String,Drawable等資源乘粒。 還有自定義View的時(shí)候也常用到context.obtainStyledAttributes()這個(gè)方法。
由上面第三點(diǎn)getContext的不同可以知道如果在應(yīng)用里通過obtainStyledAttributes獲取資源伤塌,使用getContext()和getApplicationContext() 是不一樣的灯萍。
例如應(yīng)用在Manifest里設(shè)置了App的Theme,通過getApplicationContext().getTheme是可以取得應(yīng)用的Theme每聪;但是通過Activity的context.getTheme是獲取不到的旦棉。
會(huì)有部分人誤認(rèn)為只要設(shè)置了Application的Theme,Activity里getTheme就是正確的药薯,我就是那個(gè)人绑洛。以下是Context的部分類圖:
可以很明顯地看到Activity是繼承ContextThemeWrapper,而Application是繼承ContextWrapper的童本,ContextThemeWrapper里重寫了setTheme方法真屯。
如果使用getContext獲取資源,取決于Context是屬于哪一個(gè)穷娱。
一個(gè)簡(jiǎn)單的例子:
Manifest設(shè)置了如下樣式:
使用兩個(gè)不同的Context創(chuàng)建EditText绑蔫,其對(duì)應(yīng)的樣式也不一樣:
ActivityContext的EditText可以有主題定制的顏色,而getApplication的則沒有泵额,因?yàn)樵贓ditText的初始化時(shí)使用的是context.obtainStyledAttributes 這個(gè)方法配深,而這個(gè)方法調(diào)用的是getTheme().obtainStyledAttributes,由上面可以知道context的不同嫁盲,getTheme也是不同的篓叶,所以出現(xiàn)這樣的問題。
public final TypedArray obtainStyledAttributes(@StyleableRes int[] attrs) {
? ? return getTheme().obtainStyledAttributes(attrs);
}
這種小問題羞秤,稍不注意有時(shí)候也是個(gè)大麻煩缸托。