2017-09-14 21 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