我的应用程序包含三个类:
地图包含google地图方法, DataWriter 包含文件编写器方法,只要在运行时 IsWriteEnabled()具有写存储权限检查> 。
我从地图呼叫 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
}
是否有更好的方法将上下文传递给未附加到主活动的类? 该方法的调用是否应该正确?
答案 0 :(得分:3)
您可以随意将Context
传递给未以任何您喜欢的方式附加到Activity
的类。通过类的构造函数传递它是一个好习惯(依赖注入),但是仅在您的类需要Context
才能完全正常运行的情况下。如果您需要Context
仅在特定方法中使用,不妨将其作为参数传递给该方法。
您在这里要知道的最重要的事情是Activity
的生命周期是有限的。如果您在类Activity Context
中保留对Activity
的引用,则会造成内存泄漏:垃圾收集器将无法销毁该Activity
,因为有一个在某处引用它。这就是为什么人们通常更喜欢处理Application Context
的原因,因为它总是比您可以创建的任何类都要久。
现在,对您的代码进行更正:不要扩展AppCompatActivity
只是继承ActivityCompat
。通过扩展AppCompatActivity
,您将向类授予与类无关的许多生命周期管理,资源处理和用户交互方法的访问权限。 AppCompatActivity
应该仅由Activities
扩展。否则,其名称不能以活动 :)
作为处理用户交互的组件,请求权限是Activity
或Fragment
的责任,因此只需在Map
或MainActivity
中请求权限。另外,我假设Map
确实在执行Fragment
应该做的事情,并且您不只是扩展Fragment
来访问某些Fragment
方法:)