Android-Wake блокировка не приобретая должным образом, приложение должно продолжать работать в режиме ожидания

в моем приложении, в методе onCreate () основной деятельности я создаю блокировку пробуждения, так что процессор будет продолжать работать, если телефон будет включен standb/экран выключается.

также в методе onCreate у меня есть намерение создать службу, которая использует акселерометр. Эта служба должна постоянно работать, пока приложение открыто и контролирует значения акселерометра (я знаю, что это не хорошо для батареи, но мне нужно это сделать). Вот мой код на данный момент и обслуживание начинается нормально.

public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);  

        PowerManager pm = (PowerManager) getSystemService(POWER_SERVICE);
        PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK, "Howaya");
        wl.acquire();

        if (appStart == true)  
        { 
            Intent AccelService = new Intent(this, Accelerometer.class);
            AccelService.putExtra("unreg", false);
            startService(AccelService);
        }
        appStart = false;
  }

у меня есть следующие разрешения в мой манифест -

<uses-permission android:name="android.permission.WAKE_LOCK" />

Я пробовал это с разными замками - тусклый экран и полная яркость без толку тоже. Мой вывод на logcat здесь -

F/PowerManager(15628): android.util.Log$TerribleFailure: WakeLock finalized while still held: Howaya
F/PowerManager(15628):  at android.util.Log.wtf(Log.java:260)
F/PowerManager(15628):  at android.util.Log.wtf(Log.java:239)
F/PowerManager(15628):  at android.os.PowerManager$WakeLock.finalize(PowerManager.java:329)
F/PowerManager(15628):  at dalvik.system.NativeStart.run(Native Method)

Я видел людей, говорящих, что частичные wakelocks не работают так, как они должны делать, например, эта ссылка страница ошибки Google standby но это было выпущено и закрыто в прошлом году, поэтому я не знаю, что дело, может кто поможет пожалуйста? У меня есть желание HTC в отношении этого последнего пункта тоже, спасибо.

3 ответов


в моем приложении, в onCreate () метод основной деятельности я создаю блокировку пробуждения, так что процессор будет продолжать работать, если телефон идет на standb / экран выключается.

пожалуйста, используйте android:keepScreenOn на одном из виджетов в вашем макете вместо этого. Это намного, намного безопаснее для действий, чем вручную иметь дело с WakeLock. Кроме того, вам не нужно WAKE_LOCK разрешения, то, если не ошибаюсь.

мой вывод на logcat здесь

что ошибка потому что вы никогда не отпустите!--1-->. Пожалуйста, не утечка WakeLocks.

теперь вам удалось написать всю эту прозу и включить все эти списки, и вы забыли одну маленькую вещь:фактически говоря нам, что ваш вопрос. Это довольно важный элемент для сайта вопросов и ответов, такого как StackOverflow. И, нет, " кто-нибудь может помочь здесь, пожалуйста?"не считается вопросом, когда вы никогда не определяете, какую "помощь" вы хотите получить.


проблема возникает, потому что ваш объект WakeLock является локальной переменной области внутри метода OnCreate. После выполнения метода-объект WakeLock больше не ссылается-таким образом, имеет право на сборку мусора. Если Dalvik GC происходит-объект готов к завершению-и внутренний код финализатора предупреждает Вас, что WakeLock все еще удерживается - и активен - но будет GC'Ed. Вы должны получить новый объект WakeLock и назначить его полю типа класса WakeLock в производном классе activity. Читайте о Объектно-ориентированное программирование и сборщик мусора-вы поймете проблему.


Как сказал @Michal P, вы приобретаете wakelock в методе onCreate, но никогда не выпускаете его.

когда GC сканирует этот объект с нулевой ссылкой, вызовите метод finalize по умолчанию, но на самом деле он активен.

  @Override
    protected void finalize() throws Throwable {
        synchronized (mToken) {
            if (mHeld) {
                Log.wtf(TAG, "WakeLock finalized while still held: " + mTag);
                Trace.asyncTraceEnd(Trace.TRACE_TAG_POWER, mTraceName, 0);
                try {
                    mService.releaseWakeLock(mToken, 0);
                } catch (RemoteException e) {
                }
            }
        }
    }