201709015工作日記--上下文的理解,ASM
1.Android上下文理解
- Android上下文對象,在Context中封裝一個所謂的“語境”,Activity、Service、Application都繼承自Context,所以在這三者創建時都會創建應用上下文Content
- 所有的組件共同擁有Application Context,可以通過getApplicationContext()獲取
- Activity中獲取Context對象,直接this,匿名內部類指定XXXActivity.this
Context的作用是用來訪問全局信息的,比如每個UI組件的構造函數都是要傳入一個Context的。拿TextView來打比方:
TextView textView =newTextView(this); textview.setText(R.string.balabala);
這裏實例化的時候傳入了一個this,這個值就是一個Context。
這裏設置了一個在strings.xml文件中預定義的字符串,setText(int resid)函數的源碼中是這樣的:
publicfinalvoidsetText(intresid){
setText(getContext().getResources().getText(resid));
}
註意這裏面使用了getContext()函數去獲取全局信息資源,並通過id篩選出自己想要的資源。這裏的這個getContext()獲取到的上下文,就是我們在實例化TextView時傳進去的Context。
所以,Context是用來協助對象訪問全局信息的。
使用的時候要尤其註意,Context傳出去,使用完要及時釋放掉,因為Context是有一個引用抓取著Activity的,如果Activity生命周期結束後還沒有及時釋放掉Context,很容易造成內存泄露。
2.幾個常用的上下文
this
即當前的application或activity或service。
getApplication()
系統提供的單例對象,每個應用只有一個。只能在activity和service(以及application類)中調用,獲得應用的application單例對象。
getApplicationContext()
getApplicationContext()返回應用的上下文,生命周期是整個應用。相對比getApplication獲取的對象是一樣的,都是應用的application單例對象,但是應用範圍更加廣,可以例如broadcast receiver中可以使用。
getBaseContext()
返回由構造函數指定或setBaseContext()設置的上下文,調用該方法時獲取一個ContextWrapper初始化為具體的Application、Service、ContextThemeWrapper的context。不建議使用。
getActivity()
在fragment中獲取fragment從屬的activity的context,相當於該Activity的activity.this。存在於該activity的生命周期中。
getContext()
返回當前這個View對象的context。
3.今天培訓講了一點點的activity上下文以及管理的東西。
activity實際上是繼承了context的上下文,只是他自己下面又實現了一些可視化的(不是window、widget)等可視化界面。
activity -> activityThread -> AMS
201709015工作日記--上下文的理解,ASM