0

我有一个非常简单的 Android Wear 应用程序,它基本上只是移动设备上的一个按钮,我想用它来打开和关闭我的 Android Wear 设备的显示。我让应用程序向 Android Wear 设备发送消息,告诉它根据屏幕状态获取或释放唤醒锁。wakeLock.acquire() 工作得非常好,但是当我发送消息以释放 wakeLock 时,应用程序行为异常。获取 wakeLock 似乎总是有效,但释放它会导致以下情况之一:它要么崩溃并说“不幸的是你的应用程序已停止工作”,要么它不会做任何事情(好像它认为我没有持有wakeLock 所以它甚至不会进入包含释放调用的 if 语句)或者它会看到它被持有但我对 wakeLock.release() 的调用没有 t 似乎实际上释放了锁定(屏幕永远不会变暗)。有任何想法吗?

移动设备代码:

// 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;
}

佩戴设备代码:

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 代码位于侦听器服务中(没有活动,所以我没有窗口来获取和设置标志或任何东西)。我正在使用华硕平板电脑和 Round Android Wear 模拟器进行测试。打开/关闭显示器是如此简单的功能,以至于我在我查看的任何第三方应用程序中都找不到支持,而且它给我带来这么多麻烦的事实完全令人抓狂。任何想法将不胜感激!

4

1 回答 1

1

WearableListenerService 生命周期由系统管理,因此您无法确定您的字段(特别是在不同消息first之间wakeLock保留它们的值。事实上,在我的代码中,该服务在每条消息后都会死掉。所以您可能每个都创建一个新的唤醒锁时间并尝试锁定或解锁它,而不是使用前一个。

要解决此问题,您可以创建一个具有已知生命周期的不同服务,并从 WearableListenerService 向其发送命令。

Ps 如果有问题,请以这种方式发布 logcat 输出。

于 2014-11-08T00:48:53.950 回答