全局获取context
我们在许多地方都需要使用到context
,但当程序复杂起来,脱离了activity
时,我们通常需要关注是否要将context
在函数中传递,那么如何才能简化这个步骤,使得在任何地方都能获取context
呢?
Android提供了一个application
类,当应用程序启动时,会对这个类进行初始化,我们可以对这个类进行自定义,用来管理全局context
。
新建一个MyApplication
:
kotlin
class MyApplication : Application() {
companion object {
lateinit var context : Context
}
override fun onCreate() {
super.onCreate()
context = applicationContext
}
}
这里通过设置了静态变量context
获取application
的context
。系统会提示我们将context
设置成全局变量容易引发内存泄漏,但是这里时全局application的context,在整个生命周期内都不会回收,所以不会有上述问题,添加注解忽略即可:
kotlin
class MyApplication : Application() {
companion object {
@SuppressLint("StaticFieldLeak")
lateinit var context : Context
}
override fun onCreate() {
super.onCreate()
context = applicationContext
}
}
然后在AndroidManifest.xml
里面的<application>
标签下进行指定:
xml
<application
android:name=".MyApplication"
android:allowBackup="true"
android:dataExtractionRules="@xml/data_extraction_rules"
android:fullBackupContent="@xml/backup_rules"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/net_config"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true"
android:theme="@style/Theme.WanAndroid"
tools:targetApi="31">
...
</application>
接下来在任何地方只需要调用MyApplication.context
即可。
使用Intent传递对象
使用Intent
时可以用来启动Activity
,Service
等,还可以提供一些附加数据。但是这些提供附加数据的类型是有限的,那么如何传递自定义对象呢?
Serializable
方式
这个方式是通过将对象进行序列化,转换成一个可存储或可传输的状态,然后传过去后再进行反序列化,比如我们新建一个Person.kt
:
kotlin
class Person : Serializable { //继承Serializable接口实现可序列化
var name = ""
var age = 0
}
在Activity
中进行传递:
kotlin
val person = Person()
person.name = "Tom"
person.age = 20
val intent = Intent(this, MainActivity2::class.java)
intent.putExtra("person_data", person)
startActivity(intent)
然后获取对象:
kotlin
val person = intent.getSerializableExtra("person_data") as Person
这样就能实现传输了。
Parcelable
方式
Parcelable
实现方式是将对象进行分解再进行传递。
Kotlin为我们提供了简便的使用Parcelable
的方法,不用手动去拆分:
kotlin
@Parcelize
class Person(var name: String, var age: Int) : Parcelable
使用这个注解即可,然后Activity中:
kotlin
val person = intent.getParcelableExtra("person_data") as Person
即可获取传递的对象了。