获取当前Activity最主要的作用当然是为了能随时获取Context,超多地方都需要用到它
什么是Context
源码中的注释是这么来解释Context的:Context提供了关于应用环境全局信息的接口。Context到底可以实现哪些功能呢?弹出Toast、启动Activity、启动Service、发送广播、操作数据库等等都需要用到Context
Context作用域
如何获取当前Activity
我的思路是创建一个Activity管理类,通过在Application监听所有Activity的生命周期回调来获取当前Activity。
首先创建Activity管理类(object声明相当于单例)
object ActivityManager {
// 弱引用
private var sCurrentActivityWeakRef: WeakReference<Activity>? = null
fun getCurrentActivity(): Activity? = sCurrentActivityWeakRef?.get()
fun setCurrentActivity(activity: Activity) {
sCurrentActivityWeakRef = WeakReference(activity)
}
}
创建自己的Application,并监听所有Activity的生命周期回调。
P:
这里的Application也是用的单例模式,可以通过WeatherApplication.getInstance()
来获取Application
class WeatherApplication : Application() {
// 单例
companion object {
fun getInstance(): WeatherApplication = Inner.instance
}
private object Inner {
lateinit var instance: WeatherApplication
}
override fun onCreate() {
super.onCreate()
Inner.instance = this
// 监听所有Activity的生命周期回调
registerActivityLifecycleCallbacks(object : ActivityLifecycleCallbacks {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
}
override fun onActivityStarted(activity: Activity) {
}
override fun onActivityResumed(activity: Activity) {
// 在此处设置当前的Activity
ActivityManager.setCurrentActivity(activity)
}
override fun onActivityPaused(activity: Activity) {
}
override fun onActivityStopped(activity: Activity) {
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
}
override fun onActivityDestroyed(activity: Activity) {
}
})
}
}
别忘了在AndroidManifest.xml
中注册Application
android:name=".WeatherApplication"
现在通过ActivityManager.getCurrentActivity()
就能在代码任意地方获取当前的Activity了
网友评论