最近在项目中遇到一个问题,解决的过程记录一下,备忘!
过程:
在系统更改Locale的时候,需要做一些操作。我采用的办法是使用一个BroadcastReceiver,接收ACTION_LOCALE_CHANGE 的广播intent,在onReceive()中做处理。
最初的解决方案,是在主Activity 的onCreate( )函数中,动态注册一个BroadcastReceiver,并在onDestroy( )中,取消注册。后来测试时发现如果退出这个Activity(finish),那么就无法接收广播了,因为此时已经取消注册了。
接着我想可以在生命周期更广的Application 类的onCreate()中来注册,一分析发现也不行:一者虽然生命周期长,但也是有限的,一旦程序完全退出,就收不到广播了。二者,Apllication 类的onTerminate( )不是一定能被调用的,暂时也想不到其他更好的来unregister Receiver的地方。
最后,还是采用静态注册的方式解决了这个问题。
总结:
- 动态注册的BroadcastReceiver,使用比较方便,在代码中随时可以加入。但是要注意,必须适时的unregister,否则会有内存泄漏。同时,其生命周期是有限的,在使用时要注意。
- 静态注册的BroadcastReceiver,需要在manifest文件中标出,并继承BroadcastReceiver类。此方法生成的对象,只在调用onReceive()时有效,一旦返回,就无效。一定程度上可以认为,此receiver一直有效。
- Application对象虽然可以保存一些全局数据,生命周期也比较长,但是在清理数据方面可能会有问题,使用时也要慎重。