2014-11-07 4 views
0

У меня очень простое приложение для Android Wear, которое в основном представляет собой только одну кнопку на мобильном устройстве, которую я хочу использовать, чтобы включить и выключить отображение устройства Android Wear. У меня есть приложение, отправляющее сообщения на устройство Android Wear, чтобы сообщить ему о приобретении или выпуске wakeLock в зависимости от состояния экрана. WakeLock.acquire() работает отлично, но когда я отправляю сообщение, чтобы освободить wakeLock, приложение неправильно. Приобретение wakeLock, похоже, всегда работает, но его выпуск приведет к одному из следующих: он либо сбой, либо скажет «К сожалению, ваше приложение перестало работать», или оно ничего не сделает (как будто он считает, что я не держу wakeLock, чтобы он даже не входил в if-statment, в котором содержится запрос на выпуск), или он увидит, что он удерживается, но мой вызов wakeLock.release(), похоже, фактически не освобождает блокировку (экран никогда не тускнеет). Есть идеи?Android Wear приложение, которое падает при выпуске wakeLock

Мобильный Код устройства:

// sendToast is the onClickListener function for my toggleButton 
private void sendToast() { 
    if(isChecked(findViewById(R.id.toggleButton))) 
     message = ON_MESSAGE; 
    else 
     message = OFF_MESSAGE; 

    if (nodeId != null) { 
     new Thread(new Runnable() { 
      @Override 
      public void run() { 
       client.blockingConnect(CONNECTION_TIME_OUT_MS, TimeUnit.MILLISECONDS); 
       Wearable.MessageApi.sendMessage(client, nodeId, message, null); 
       client.disconnect(); 
      } 
     }).start(); 
    } 
} 

private boolean isChecked(View view) { 
    if (((ToggleButton) view).isChecked()) 
     return true; 
    else 
     return false; 
} 

Wear Код устройства:

public class ListenerService extends WearableListenerService { 
    private PowerManager powerManager; 
    private PowerManager.WakeLock wakeLock; 
    private static final String ON_MESSAGE = "On!"; 
    private static final String OFF_MESSAGE = "Off!"; 
    boolean first = true; 

    private void setupWakeLock() { 
     powerManager = (PowerManager) getSystemService(POWER_SERVICE); 
     wakeLock = powerManager.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
      PowerManager.ACQUIRE_CAUSES_WAKEUP, "wakeLock"); // SCREEN_BRIGHT_WAKE_LOCK 
    } 

    @Override 
    public void onMessageReceived(MessageEvent messageEvent) { 
     if (first) { 
      setupWakeLock(); 
      first = false; 
     } 

     Toast.makeText(this, wakeLock.toString(), Toast.LENGTH_LONG).show(); 

     if (messageEvent.getPath().equals(ON_MESSAGE)) { 
      if (!wakeLock.isHeld()) { 
       wakeLock.acquire(); 
       Toast.makeText(this, ON_MESSAGE, Toast.LENGTH_LONG).show(); 
      } 
     } else if (messageEvent.getPath().equals(OFF_MESSAGE)) { 
      if (wakeLock.isHeld()) { 
       wakeLock.release(); 
       Toast.makeText(this, OFF_MESSAGE, Toast.LENGTH_LONG).show(); 
      } 
     } 
    } 

    private void showToast(String message) { 
     Toast.makeText(this, message, Toast.LENGTH_LONG).show(); 
    } 
} 

Я на основе проекта от проекта я нашел на GitHub и изменил некоторые вещи вокруг. Я не пытаюсь разработать приложение для распространения только одноразовое приложение для моего собственного использования. Я использую wakeLock, потому что код Android Wear находится в Службе Listener (нет активности, поэтому у меня нет окна для получения и установки флагов или чего-то еще). Я тестирую, используя планшет Asus и круглый эмулятор Android Wear. Включение/выключение дисплея - такая простая функция, что я не мог найти поддержку в каких-либо сторонних приложениях, на которые я смотрел, и тот факт, что он дает мне эту проблему, полностью сходит с ума. Благодарим за любую идею!

ответ

1

WearableListenerService жизненный цикл управляется системой, так что вы не можете быть уверены, что ваши поля (в частности, first и wakeLock сохраняют свои значения между различными сообщениями. И в самом деле, в моем коде эта услуга умирает после каждого сообщения. Так что, вероятно, вы создаете новый wakelock каждый раз и пытаетесь заблокировать или разблокировать его, вместо того, чтобы работать с предыдущим.

Для решения этой проблемы вы можете создать другую службу с известным жизненным циклом и отправить ей команды из вашего WearableListenerService.

Ps Пожалуйста, опубликуйте вывод logcat с таким видом, если вопрос.

 Смежные вопросы

  • Нет связанных вопросов^_^