android - 有没有更好的方法将上下文传递给辅助 kotlin 类?
问题描述
我的应用程序包含三个类:
- 类 MainActivity : AppCompatActivity()
- 类地图:片段(),OnMapReadyCallback
- 类 DataWriter(val context: Context): AppCompatActivity()
Map包含 google map 方法,DataWriter包含 File writer 方法,只要在运行时IsWriteEnabled()上进行写入存储权限检查。
我从Map调用IsWriteEnabled()以便我可以通过以下方式检查我是否有权限:
class Map : Fragment() , OnMapReadyCallback {
private lateinit var mdataWriter: DataWriter
// a lot of code removed
override fun onMapReady(googleMap: GoogleMap) {
mdataWriter = DataWriter(requireContext())
mdataWriter.isWriteEnable()
}
这是我的 DataWriter.kt
class DataWriter(val context: Context): AppCompatActivity(){
fun isWriteEnable(): Boolean {
if (ActivityCompat.checkSelfPermission(
context,
Manifest.permission.WRITE_EXTERNAL_STORAGE
) != PackageManager.PERMISSION_GRANTED
) {
ActivityCompat.requestPermissions(
context as Activity,
arrayOf(
Manifest.permission.WRITE_EXTERNAL_STORAGE
),
WRITE_REQUEST_CODE
)
} else {
Log.e("DB", "PERMISSION GRANTED")
}
return true
}
我的问题
有没有更好的方法将上下文传递给未附加到主要活动的类?对方法的调用是否应该如此?
解决方案
您可以自由地将 a 传递给一个未以任何您喜欢的方式Context
附加到 an的类。Activity
通过类的构造函数传递它是一种很好的做法(依赖注入),但仅在您的类需要Context
完全正确运行的情况下。如果您需要 aContext
仅在特定方法中使用,不妨将其作为参数传递给该方法。
在这里您必须注意的最重要的事情是 anActivity
具有有限的生命周期。如果在类中保留对 an 的引用,Activity Context
该类的寿命将超过 that Activity
,则会造成内存泄漏:垃圾收集器将无法销毁它,Activity
因为某处存在对它的引用。这就是为什么人们通常更喜欢处理一个Application Context
而不是,它总是比你可以创建的任何类都要长。
现在,对您的代码进行更正:不要AppCompatActivity
仅扩展为继承ActivityCompat
。通过扩展AppCompatActivity
,您授予类访问许多与您的类无关的生命周期管理、资源处理和用户交互方法。AppCompatActivity
应该只Activities
扩展. 否则,它的名字不会以Activity结尾:)
作为处理用户交互的组件,请求权限是Activity
or的职责Fragment
,因此只需在Map
or中请求权限即可MainActivity
。另外,我假设这Map
确实在做 aFragment
应该做的事情,而且你不仅仅是Fragment
为了访问某些Fragment
方法:)