Android Wear应用程序在我发布wakeLock时崩溃

时间:2014-11-07 19:06:23

标签: android wear-os wakelock android-wake-lock moto-360

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

移动设备代码:

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

1 个答案:

答案 0 :(得分:1)

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

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

P.S。如果有问题,请用这种类型发布logcat输出。