Android - Wake Lock не получает должным образом, приложение должно работать в режиме ожидания - PullRequest
6 голосов
/ 19 февраля 2011

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

Также в методе 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 но это было выпущено и закрыто в прошлом году, так что я не знаю, случай, может кто-нибудь помочь здесь, пожалуйста? У меня есть HTC Desire, что касается последнего пункта, спасибо.

Ответы [ 3 ]

9 голосов
/ 30 марта 2011

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

2 голосов
/ 19 февраля 2011

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

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

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

Эта ошибка из-за того, что вы никогда не выпускаете WakeLock.Пожалуйста, не пропускайте WakeLocks.

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

0 голосов
/ 06 апреля 2017

Как сказал @Michal P, вы получаете пробуждение в методе 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) {
                }
            }
        }
    }
...