0

プロジェクト ステートメント:

私は数えている6つのものを持つ単純なカウンターアプリを持っています。私のウェアラブルでは、数えたいものを選択するラジオボタングループがあります。次に、時計のアイテムの現在のカウントが表示され、時計から1を加算または減算できます。時計は単なるインターフェースであり、対話デバイスです。処理は行いません。情報のすべての処理と情報の保存はモバイル上で行われます。したがって、時計はメッセージを送信して情報を表示するだけです。

使い方:

ウェアは Wearable.MessageApi.sendMessage() を介してモバイルにメッセージを送信し、電話は Wearable.DataApi.putDataItem() で応答します。時計は、参照しているアイテムに加えて、add/subtract/countRequest などの複数の形式の情報を送信しています。モバイルは要求されたアイテム数でのみ応答し、時計は表示されているものとは異なる値である場合にのみ表示を変更する必要があります。

これは一般的なメッセンジャーの理解に関する質問です。私は持っている

public class MyListenerService extends WearableListenerService{
    @Override
    public void onMessageReceived(MessageEvent me){
        showToast();
    }
}

リスナーが機能します。リスナーは実際に必要なデータを送信しているので、リスナーで何か便利なことをしたいと思っています。しかし、経験が限られているため、サービスとアクティビティ間の通信に問題があります。メッセージングおよびブロードキャスト レシーバーについて調べました。私の結果やより良い理解を得るために実装する方法についてのアイデアを探しています。

コードを作成しようとして収集したものから、サービスはインターフェイスと直接対話できないため、何らかの方法でアクティビティと通信する必要があります。私が読んだ2つの方法は、メッセージング(ハンドラー)とブロードキャストレシーバーです。

これらの方法はそれぞれ機能しますが、欠点があり、理解を深めたり助けを求めたりしています。

ハンドラーの場合:静的ハンドラークラスを作成してハンドラークラス内でコードを実行できますが、静的であるため、非静的オブジェクトを呼び出すことはできません。つまり、これを実行しようとすると失敗します。

サービス:

public class MyListenerService extends WearableListenerService{
    @Override
    public void onMessageReceived(MessageEvent me){
        Activity.mHandler.sendEmptyMessage(MyConstants.COMMAND);
    }
}

アクティビティ:

public static Handler mHandler = new Handler() {
    @Override
    public void handleMessage(Message msg) {
        doThis(msg.what);
    }
}; 

private void doThis(int command){
    processCommand();
    updateUserInterface();  
}

上記のハンドラーを実装する方法はありますか?メッセージを処理するときにトーストを行うだけで機能するため、メッセージを受信できます。静的オブジェクトから非静的オブジェクトを呼び出すことはできません。そのため、doThis() のコードをハンドラー内に投げただけでも、インターフェース オブジェクトを更新できないと想定しています。LiveListeners を使用していて、onMessageReceived() が別のサービスではなくアクティビティ内にあったとき、doThis() を直接呼び出すだけでうまくいきました。BroadcastReceiverの場合:表示するコードがたくさんあるので、代わりに私の問題を説明し、そこから答えることができるかもしれません. 明らかに、onResume()/onPause() で登録/登録解除する必要があります。これでは、電話がスリープ状態になったときに情報を処理できなくなります。

「LiveListeners」を行う前は、アクティビティがフォアグラウンドにあり、電話がスリープしていない限り、正常に機能していました。眠っている間に動作させる唯一の方法は、バックグラウンドで動作するサービスを利用することです。

だから私の質問は、モバイルがスリープしている間にウェアラブルがモバイルに送信している情報を処理できるように、この状況を処理する最良の方法は何ですか. または、私が見つけられなかったデータを送信する別の方法はありますか?

4

2 に答える 2

0

極端に単純化したいわけではありませんが、簡単な方法が気に入っています。意図を持って、モバイルまたはウェアラブルをスリープから目覚めさせ、他のスレッドも目覚めさせてデータを処理します。

   @Override
    protected void onHandleIntent(Intent intent) {
        // TODO: This method is called when the BroadcastReceiver is receiving
        // an Intent broadcast.

        String tmp = " ";
        PowerManager.WakeLock wakeLock = null;
       // wakeLock.acquire();
        if (intent.getAction() != null) {
             tmp=intent.getAction();
            PowerManager powerManager = (PowerManager) getSystemService(POWER_SERVICE);

            wakeLock = powerManager.newWakeLock((PowerManager.SCREEN_BRIGHT_WAKE_LOCK | PowerManager.FULL_WAKE_LOCK | PowerManager.ACQUIRE_CAUSES_WAKEUP), TAG);
            wakeLock.setReferenceCounted(true);
            if(! wakeLock.isHeld()) {
                wakeLock.acquire();
            }

https://github.com/NickZt/E52/blob/master/wear/src/main/java/ua/zt/mezon/e52/core/MySpcIntentService.javaからのコード スニペット

于 2017-01-09T22:39:47.640 に答える