0

基本的に、Android Wear デバイスの表示をオンまたはオフにするために使用したい、モバイル デバイス上の 1 つのボタンだけである、非常にシンプルな Android Wear アプリがあります。画面の状態に応じて wakeLock を取得または解放するように Android Wear デバイスにメッセージを送信するアプリケーションがあります。wakeLock.acquire() は完全に正常に動作しますが、メッセージを送信して wakeLock を解放すると、アプリケーションが誤動作します。wakeLock の取得は常に機能しているように見えますが、解放すると次のいずれかが発生します: クラッシュして「残念ながらアプリが動作を停止しました」と表示されるか、何もしません (あたかも私がwakeLock を使用しているため、解放呼び出しを含む if ステートメントに入ることさえありません) または、保持されていることがわかりますが、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 で見つけたプロジェクトに基づいており、いくつかの点を変更しました。私は配布用のアプリを開発しようとしているのではなく、自分で使用するための 1 回限りの小さなアプリです。Android Wear コードがリスナー サービスにあるため、wakeLock を使用しています (アクティビティがないため、フラグを取得して設定するためのウィンドウなどはありません)。Asus タブレットと Round Android Wear エミュレーターを使用してテストしています。ディスプレイのオン/オフは非常に単純な機能であり、私が見たどのサードパーティ製アプリでもサポートを見つけることができませんでした.これが私にこれほど多くの問題を与えているという事実は完全に腹立たしいです. どんなアイデアでも大歓迎です!

4

1 に答える 1

1

firstWearableListenerService のライフサイクルはシステムによって管理されるため、フィールド (特に、異なるメッセージ間で値を保持すること) を確認することはできませんwakeLock。実際、私のコードでは、このサービスはすべてのメッセージの後に終了します。おそらく、それぞれに新しいウェイクロックを作成します。前のものを操作する代わりに、時間をかけてロックまたはロック解除しようとします。

この問題を解決するには、既知のライフサイクルで別のサービスを作成し、WearableListenerService からコマンドを送信します。

Ps質問があれば、そのような種類のlogcat出力を投稿してください。

于 2014-11-08T00:48:53.950 に答える