Android(Kotlin)获取应用全局上下文 ApplicationContext

需求

Android(Kotlin)获取应用全局上下文 ApplicationContext

有些场景下需要使用的 Context,是和页面无关的,仅和应用进程相关,比如:读写文件或访问数据库。这些场景下,我们希望可以在项目内任意位置,直接获取应用全局上下文(ApplicationContext);而不是在 Activity、Fragment 或 Service 等组件里获取到Context,再作为参数到处传递。


解决方案

Application类,是和应用进程相关的,每个应用进程只有一个Application实例。Application中可获取ApplicationContext,此Context和页面等组件无关,只和应用进程相关。将获取到的ApplicationContext转化为顶层属性,则可以在项目任意位置调用。

实现步骤如下:

  1. 自定义 Application,保存自身的 Application 实例。
  2. 在AndroidManifest中,设置应用使用自定义Application。
  3. 定义顶层属性 appContext,它被赋值为 Application 实例的 ApplicationContext。

核心代码

自定义 Application

package com.example.applicationcontext

import android.app.Application

/**
 * 自定义 Application
 */
class MyApplication : Application() {

    companion object {
        lateinit var instance: Application
    }

    init {
        instance = this
    }

}

配置 AndroidManifest

<application>标签设置 name 属性,属性值为自定义Application。

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <application
        android:name=".MyApplication"
    </application>

</manifest>

ContextHolder

建立 ContextHolder.kt 文件,在此文件内将 ApplicationContext 转化为顶层属性appContext,以供项目内调用。

package com.example.fileio.util

import android.content.Context
import com.example.fileio.MyApplication

val appContext: Context = MyApplication.application.applicationContext

调用

项目内任意位置,可以调用到 appContext

package com.example.applicationcontext

import com.example.applicationcontext.manage.appContext

class Test {

    fun test() {
        appContext
    }

}


示例图片


示例项目(Gitee开源)

Android/ApplicationContext · 宋冠巡/示例 - 码云 - 开源中国 (gitee.com)


Application 说明

Application :用于维护应用程序全局状态的基类。

Application  |  Android Developers (google.cn)

getApplicationContext() 说明

返回当前进程的全局唯一的Application对象的上下文。

当需要一个生命周期与当前上下文分离的上下文时,才应该使用该上下文(ApplicationContext)。

该上下文与进程的生命周期关联,而不是与当前组件相关联。


参考

Context的应用场景

Application 方法执行顺序 

猜你喜欢

转载自blog.csdn.net/sgx1825192/article/details/127885808