最後更新日期:2024 年 01 月 17 日

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 到底是什么?

Android Context完全解析,你所不知道的Context的各种细节

深入理解 Android 中的各种 Context

What is Context in Android?

面试官灵魂发问:你真的懂 Context 吗?

requireActivity() and requireContext() in kotlin

How to get Context in Jetpack Compose

Last modified: 2024 年 1 月 17 日

Author

Comments

Write a Reply or Comment

Your email address will not be published.