android服务内存泄漏

1,225 阅读1分钟

最近在开发即时通讯,有悬浮视频框效果。需要使用服务。记录开发过程中两处内存泄漏。

一与服务进行绑定的Activity内存泄漏

不要通过IBinder向服务中传递绑定的Activity对象。原因:解绑服务,Activity销毁,服务未必会停止。悬浮窗效果(服务未停止),对应的Activity必定会内存泄漏。长生命周期的Service持有短生命周期的Activity对象。

二服务中binder对象内存泄漏

服务中实现的binder内部类一定不要写业务逻辑。假如把业务逻辑写到binder类中,那么意味着服务中也要调用binder对象中的方法。binder的滥用很有可能出现binder内存泄漏(binder被Service实现的其他外部接口持有,导致binder释放不了)。而是要把业务逻辑写到Service类中,binder去调用Service的方法。

三绑定服务Activity和Service互相调用解决方案

  • 所有业务逻辑必须写到Service类里边。

  • Activity调用服务中方法,通过绑定服务,获取binder对象,调用binder方法,binder调用service中的业务逻辑方法。如需传参,可直接通过方法定义参数传递。

  • 服务调用Activity方法,通过服务发送广播,Activity监听广播。收到广播去调用activity中方法。如需传参,可让binder提供返回值方法,activity调用binder方法获取参数。

注意:binder就是桥梁,不要承载任何业务逻辑