两个知识点,因为菜鸟放在了一起。
今天在弄一个电池管理的程序,涉及到建立一个BroadcastReceiver ,建立一个IntentFiler,截取系统广播的Intent.ACTION_BATTERY_CHANGED 消息。测试时,程序该功能运行正常,但是当按back按键后,Android Monitor报错:
“XXXX.... has leaked IntentReceiver ”,"XXXX... Are you missing a call to unregisterReceiver()?"
我是在OnCreate中对于BroadcastReceiver 作了注册,百度了一下,看到一些blog上的demo在OnDestroy中作了注销,更换了google继续确认下,头一条就是android官网上关于Anroid生命周期的描述,截个图就一幕了然:
一个Activity启动后或从后台转到前台顺序执行OnCreate, OnStart, OnResume,当按back后,该activity处于OnStop状态,会顺序执行OnPause、OnStop、OnDestroy。实际当中利用Log工具验证了下执行顺序,没有问题。也就是我在OnCreate中注册的BroadcastReceiver当back按键按下后没有注销,当程序再次处于focus状态,又重新注册了一遍……
根据网站建议:
1 BroadcastReceiver 的注册与注销在OnStart、OnStop中进行;
2 OnPause和OnResume两个活动会经常发生,比如休眠或Intent传送,因此在这两个函数中的处理应当简洁
……
将registerReceiver、unregisterReceiver分别放到了重载后的Onstart以及OnStop函数中,经测试工能正常。
关于Activity生命周期的描述:
http://developer.android.com/reference/android/app/Activity.html
获取电池电量参考的一个blog:
http://blog.csdn.net/sheldon4090/article/details/8109605