/**
* 必须实现空方法,否则会报错
*/
private fun registerNormalLifecycle(){
val activityLifecycleCallback:ActivityLifecycleCallbacks = object : ActivityLifecycleCallbacks{
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activeActivities.add(activity)
}
override fun onActivityStarted(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityResumed(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityPaused(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivityStopped(activity: Activity) {
TODO("Not yet implemented")
}
override fun onActivitySaveInstanceState(activity: Activity, outState: Bundle) {
TODO("Not yet implemented")
}
override fun onActivityDestroyed(activity: Activity) {
activeActivities.remove(activity)
}
}
}
参考LeakCannary源码,通过Java动态代理和kotlin委托来实现,根据需要实现方法。
private val NO_OP_HANDLER = InvocationHandler { _, _, _ ->
// no op
}
/**
* Java动态代理,运行时生成了一个实现对应接口的对象,对象方法实现的InvocationHandler是一个空实现。
*/
internal inline fun <reified T : Any> noOpDelegate(): T {
val javaClass = T::class.java
return Proxy.newProxyInstance(
javaClass.classLoader, arrayOf(javaClass), NO_OP_HANDLER
) as T
}
private val activeActivities: ArrayList<Activity> = ArrayList()
/**
* 根据需要实现的接口,生成对应的代理对象,然后在代理对象中实现空方法。
* 去掉ActivityLifecycleCallbacks中不需要的空实现--》kotlin代理/委托实现
*/
private val activityLifecycleCallback: ActivityLifecycleCallbacks = object : ActivityLifecycleCallbacks by noOpDelegate() {
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activeActivities.add(activity)
}
override fun onActivityDestroyed(activity: Activity) {
activeActivities.remove(activity)
}
}
当然一般我们想到的方案是通过抽象类实现简化,例如Google例子:AnimatorListenerAdapter