Android vitals - 卡住的唤醒锁和前台服务

9
在开发者控制台 - Android vitals中,我看到了一个警告,提醒这个应用程序有“Stuck partial wake locks”。
文档中的说明如下:

如果您的应用程序在后台运行(用户看不到应用程序的任何部分),并且长时间保持部分唤醒锁定,则部分唤醒锁定将变得卡住。

确实,应用程序在后台运行(播放音频),但我使用前台服务,在应用程序持有锁时通知会显示。
稍后在文档中,您可以阅读以下内容:

确保应用程序的某些部分仍然保持在前台。例如,如果您需要运行服务,可以启动前台服务。这向用户视觉上表示您的应用程序仍在运行。

但这似乎不是正确的。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);
}

请添加与wakelock和前台服务相关的代码。 - Tim
同样的问题。应用程序需要部分唤醒锁定,用户也需要它。但是谷歌认为不需要...如果您找到解决方案,请分享一下(我没有使用setReferenceCounted)谢谢! - Trancer
你解决了这个问题吗?我有类似的问题。 - ekstro
1个回答

4
我认为问题出在

标签中。

mWakeLock.setReferenceCounted(false);

应该是true,这样系统才能计数,当你释放锁时。 在您的情况下,您可能已经释放了它,但系统没有“看到”它。 这可能会导致重要指标混淆。

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


1
我认为将setReferenceCounted设置为false更安全。这意味着只需调用一次release,无论您调用多少次acquire都没有关系。但在这种情况下,我使用标志来检查是否已经锁定。https://developer.android.com/reference/android/os/PowerManager.WakeLock.html#setReferenceCounted(boolean) - Martin Vandzura
你解决这个问题了吗?我有一个类似的。 - ekstro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接