內容目錄
context 是什麼?
context , 中文可翻譯為:背景、環境、上下文、語境,其實就是指 app 的運行環境。
在 Android 裏,Context 是個抽象類別,Android 系統提供了這個抽象類別的具體實現類別 (ContextImpl),Application, Activity, Service…等都繼承了這個類別,通過這個機制我們就可以在不同執行的場景下,獲取相對應的資源及執行相對應的動作。
要注意的是,常用的 Fragment 並不是 Context ,所以通常要透過一些方法來取得。
Context 的功能
Context 作為 app 的運行環境,擁有的功能非常多,彈出Toast、啟動Activity、啟動Service、發送廣播、操作資料庫、獲取資源文件等等…。
還有許多都需要用到 Context,由於 Context 的具體能力是由 ContextImpl 類去實現的,因此在絕大多數情況下,Activity、Service 和 Application 這三種類型的 Context 是可以通用的,不過有幾種場景比較特殊,比如啟動 Activity,還有彈出 Toast,這個時候由於安全性等原因的考慮,Android 不允許 Activity 或者Toast 憑空出現。
一個Activity的啟動必須要建立在另一個Activity的基礎上,也就是以此形成的返回堆疊。
而 Toast 則必須在一個 Activity 上面彈出 ,因此在這種場景下,我們只能使用 Activity 類型的 Context,否則會出現錯誤的。
其實使用 Application 類型的 Context 也是可以啟動 Activity 的,但是不建議這麼使用,會存在關於 stack 的問題。
如何取得 context?
我們以最簡單的 Toast 為例,其中一個參數就是 context
在 Composable 中如何取得 context
使用 LocalContext.current
@Composable fun MyContent() { val context = LocalContext.current }
在 activity 中如何取得 context?
因為 Activity 繼承自 Context 類別,所以直接用 this
就可以代表 context
Toast.makeText(this, "message", Toast.LENGTH_SHORT).show()
在 fragment 中如何取得 context?
// 這是透過 getActivity() 來取得 fragment 所在的 activity Toast.makeText(activity, "message", Toast.LENGTH_SHORT).show() // 這是透過 getContext() 來取得 fragment 所在的 context Toast.makeText(context, "message", Toast.LENGTH_SHORT).show()
在 RecyclerView.Adapter 中如何取得 context ?
因為 View 類別的建構式中,需要傳入 context 做為參數,所以可以直接使用 context 屬性或是 getContext() 函式取得 context。
一般狀況下
Toast.makeText(view.context, "message", Toast.LENGTH_SHORT).show()
使用 view binding 時
Toast.makeText(binding.root.context, "message", Toast.LENGTH_SHORT).show()
如何在 Composable Function 中取得 Context
val context = LocalContext.current
如何取得 applicationContext ?
通常是我們要用到資料庫時,需要 application context
在 activity 中取得
直接用 activity 的 application 屬性
// activity 的 getApplication() 方法 val dao = TaskDatabase.getInstance(application).taskDao
在 fragment 中取得
通常用來取得資料庫的 Dao
// 這也是透過 fragment 所對應 activity 的 getApplication() val application = requireNotNull(this.activity).application val dao = TaskDatabase.getInstance(application).taskDao
參考資料
Google developers Reference: android.content.Context
Android之Context与ApplicationContext的那些事儿
Android Context完全解析,你所不知道的Context的各种细节
Comments