如果我們在java程式碼中建立一個View,那麼需要在View的構造方法中傳一個Context,Application和Activity都是Context的子類,關於使用Application和Activity的建立一個View,google的引導教程是這樣解釋的:
It is possible to get the Context for the Application, but it is incorrect to use that context for creating UI, because it does not have the correct theme information. Instead, use the Context object for the Activity instead. For example, if you are retrieving resources for your activity, you should do so from the Activity context, not the Application context.
就是說Application 這個Context沒有攜帶正確的主題資訊。我們應該使用Activity的Context。比如想取得Activity的資源就應該通過Activity context,而不是Application Context。 這是我做的一個小測試
//通過activity建立一個View
RadioButton button1 = new RadioButton(this);
button1.setLayoutParams(params);
button1.setText("RadioButton created by activity");
//通過Application建立一個View
RadioButton button2 = new RadioButton(getApplicationContext());
button2.setLayoutParams(params);
button2.setText("RadioButton created by Application");
linerLayout.addView(button1);
linerLayout.addView(button2);
複製程式碼
這2個RadioButton分別通過Activity和Application建立。最後的看看結果:
可以發現兩個button選中時的顏色不一樣,這是因為Activity建立的RadioButton攜帶有AppTheme中的主題資訊。
@color/colorPrimary
@color/colorPrimaryDark
@color/colorAccent
複製程式碼
隨便補上一張詳細的Context使用場景
- 啟動Activity在這些類中是可以的,但是需要建立一個新的task。一般情況不推薦。
- 在這些類中去layout inflate是合法的,但是會使用系統預設的主題樣式,如果你自定義了某些樣式可能不會被使用。
- 在receiver為null時允許,在4.2或以上的版本中,用於獲取黏性廣播的當前值。(可以無視)
注:ContentProvider、BroadcastReceiver之所以在上述表格中,是因為在其內部方法中都有一個context用於使用。