2017-09-14 19 views
8

在开发者控制台 - Android维权中我发现警告说应用程序有“卡住部分唤醒锁”。 在documentation它描述为Android维权 - Stuck Wake Locks和前台服务

如果保持较长时间,而您的应用程序在后台运行的部分唤醒锁器卡(无你的应用程序的一部分,是对用户可见)。

的确,应用程序在后台运行(播放音频),但我使用前台服务和应用程序保持锁定通知的整个时间是可见的。

documentation以后你可以阅读

确保您的应用程序的某些部分仍保留在前台。例如,如果您需要运行服务,请改为启动前台服务。这直观地向用户表明您的应用程序仍在运行。

但它似乎并非如此。 Android vitals忽略该应用程序是否具有前台服务?有没有人有类似的经历?

编辑:这里是代码我AudioService

PowerManager.WakeLock mWakeLock = null; 
boolean mHasWakeLock; 

void acquireLocks(){ 

    if (!mHasWakeLock) { 
     final PowerManager pm = (PowerManager) 
     context.getSystemService(Context.POWER_SERVICE); 
     mWakeLock = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,TAG); 
     mWakeLock.setReferenceCounted(false); 
     mWakeLock.acquire(); 
     mHasWakeLock = true; 
    } 
} 

void releaseLocks() { 
    if (mWakeLock != null) { 
     mWakeLock.release(); 
     mWakeLock = null; 
    } 
    mHasWakeLock = false; 
} 

void play(){ 
    startForeground(NOTIFICATION_ID, notification); 
    acquireLocks(); 
} 

void stop(){ 
    releaseLocks(); 
    stopForeground(true); 
} 
+0

请为wakelock and foreground服务添加相关代码 –

+0

同样的问题。应用程序需要部分唤醒锁,用户也需要它。但谷歌认为,否则...如果你找到一个解决方案请分享它(我不使用setReferenceCounted)谢谢! – Trancer

回答

2

我认为,问题出在

mWakeLock.setReferenceCounted(false); 

应该是true,因此系统可以指望,当您解除锁定。 就你而言,你很可能会释放它,但系统不会“看到”它。 这可能会混淆生命。

尝试将该标志设置为true。 希望这有助于。

+0

我认为setReferenceCounted false是比较安全的。这意味着它只需要一次调用发布即可,无论您称为获取有多少次都无关紧要。但在这种情况下,我使用标志来检查我是否锁定。 https://developer.android.com/reference/android/os/PowerManager.WakeLock.html#setReferenceCounted(boolean) – vandzi