代码之家  ›  专栏  ›  技术社区  ›  David

WakeLock已完成,但仍保持错误,即使我正在释放它

  •  20
  • David  · 技术社区  · 10 年前

    我有一个应该在后台运行的服务。它从我的应用打开时开始,到用户关闭我的应用时结束。

    每当我的应用程序处于后台或屏幕关闭时,我仍然需要运行服务。

    我用WakeLock实现了这一点,但出于某种原因,我在标题中出现了错误。

    这是令人担忧的,因为我可能会内存泄漏WakeLock(如果我理解正确)。

    我可以通过重新启动应用程序来触发错误。

    以下是相关代码:

    public class SomeService extends Service {
    
        @Override
        public int onStartCommand(Intent intent, int flags, int startId) {
            super.onStartCommand(intent, flags, startId);
    
            PowerManager manager = (PowerManager) getSystemService(POWER_SERVICE);
    
            mWakeLock = manager.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "TAG");
    
            if (!mWakeLock.isHeld()) mWakeLock.acquire();
    
            //Handle other processing
    
            return START_STICKY;
        }
    
        @Override
        public void onDestroy() {
    
            if (mWakeLock.isHeld()) mWakeLock.release();
            super.onDestroy();
        }
    
    }
    

    我很困惑,因为在我的 onDestroy() 我释放唤醒锁定。我不确定是什么触发了错误。

    1 回复  |  直到 10 年前
        1
  •  6
  •   Yoni Gross    9 年前

    Service.onStartCommand() 之前可以多次调用 Service.onDestroy() ,因为它们不代表“相反”的事件/状态(请参见 docs ). 您可能会获得多个锁(每次都会丢失对先前获得的锁的引用),但当您的服务完成/应用程序关闭时,您只释放最后一个锁。