[置顶] Android提高篇之-WakeLock应用与问题排查

本系列不讲如何使用wakelock,具体用法可以Google之。

wakelock申请忘记释放会造成手机耗电太快,严重影响用户体验,用户知道骂娘,厂商知道骂开发煞笔。废话说多了,进入正题。

我们现在onCreate里申请一个wakelock。别忘了需要在Manifest里申请权限

<uses-permission android:name="android.permission.WAKE_LOCK"/>

mPm = (PowerManager) getSystemService(Context.POWER_SERVICE);
		mWakeLock = mPm.newWakeLock(PowerManager.FULL_WAKE_LOCK, "test_wake");
		
		mWakeLock.acquire();
		Log.v(TAG, "isHeld:" + mWakeLock.isHeld());
然后在onDestroy里释放

mWakeLock.release();


启动应用前我们先在命令行执行
adb shell dumpsys power > power.txt

启动应用后再执行
adb shell dumpsys power > power2.txt

由于这些信息过于冗长,这里只贴出本例关心的部分。power.txt部分内容如下

Auto Power Off:
  mAutoPowerOffEventTime: 0
  mAutoPowerOffTimeMillis: 0
  mAutoPowerOffTimeoutSetting: 0

Wake Locks: size=0

Suspend Blockers: size=4
  PowerManagerService: ref count=1
  PowerManagerService.AutoPowerOff: ref count=0
  PowerManagerService.Broadcasts: ref count=0
  PowerManagerService.WirelessChargerDetector: ref count=0
power2.txt
Wake Locks: size=2
  FULL_WAKE_LOCK                 'test_wake' (uid=10226, pid=6843, ws=null) (elapsedTime=8712)
  PARTIAL_WAKE_LOCK              'dnhttpNet' (uid=10114, pid=7050, ws=null) (elapsedTime=4273)

Suspend Blockers: size=4
  PowerManagerService: ref count=1
  PowerManagerService.AutoPowerOff: ref count=0
  PowerManagerService.Broadcasts: ref count=0
  PowerManagerService.WirelessChargerDetector: ref count=0
启动应用前log里显示wake locks: size=0,启动演示app后,我们看到wake locks的大小变为2了,其中有一个名为test_wake的lock即为我们创建的;有一个不用管,是另外一个service里的。可能每个人运行的都有所不同,遇到这种情况可以选择高版本的系统运行,越往后,Android的系统越完善,有更友好的调试信息。本人用的是S4 4.2.2版本。

我们退出应用后,再看下wake_lock,发现size又为0了。

Wake Locks: size=0

大家可别小瞧了这么蛋疼的示例,关键时候会把你搞残的。关于系统方面的东西还是实战前多准备,遇事才不会乱了阵脚,有方向的去排查log。关于各个dumpsys power里的各个字段什么意思,大家可以搜索powermanagerservice源码看,不要觉得装逼,像这里信息网上都是东转西转的,只有自己看了才能相信。


你可能感兴趣的:(power,dumpsys)