【问题标题】:Android vitals - Stuck Wake Locks and foreground serviceAndroid Vitals - 卡住唤醒锁和前台服务
【发布时间】:2018-02-23 06:13:46
【问题描述】:

在开发者控制台 - Android Vitals 中,我看到应用有“卡住部分唤醒锁定”的警告。 在documentation 中,它被描述为

如果在您的应用在后台运行时长时间保持部分唤醒锁(用户看不到应用的任何部分),部分唤醒锁就会卡住。

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

稍后在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);
}

【问题讨论】:

  • 请添加唤醒锁和前台服务的相关代码
  • 同样的问题。应用程序需要部分唤醒锁定,用户也需要它。但 Google 不这么认为……如果您找到解决方案,请分享(我不使用 setReferenceCounted)谢谢!
  • 这个问题你解决了吗?我有一个类似的。

标签: android google-play-console


【解决方案1】:

我想,问题出在

mWakeLock.setReferenceCounted(false);

应该是true,以便系统可以在您释放锁时进行计数。 在您的情况下,您可能会发布它,但系统不会“看到”它。 这可能会混淆 Vitals。

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

【讨论】:

  • 我认为 setReferenceCounted false 更安全。这意味着调用一次release就足够了,调用acquire多少次都没有关系。但在这种情况下,我使用标志来检查我是否有锁。 developer.android.com/reference/android/os/…
  • 这个问题你解决了吗?我有一个类似的。
猜你喜欢
  • 2018-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多