0

项目声明:

我有一个简单的计数器应用程序,其中有 6 件我正在计算的东西。在我的可穿戴设备上,我有一个单选按钮组,可以选择我想要计算的那些东西。然后它会显示手表上项目的当前计数,然后我可以从手表上加或减 1。手表只是一个界面和交互设备。它不做任何处理。所有信息处理和信息存储都在移动设备上完成。所以手表只是发送消息和显示信息。

这个怎么运作:

磨损通过 Wearable.MessageApi.sendMessage() 向手机发送消息,手机以 Wearable.DataApi.putDataItem() 响应。除了引用的项目之外,手表还会发送多种形式的信息,例如 add/subtract/countRequest。手机仅响应请求的项目计数,并且手表仅在显示与显示的值不同时才需要更改显示。

这是一个一般的信使理解问题。我有

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

监听器工作。现在我想对监听器做一些有用的事情,因为它实际上正在发送我需要的数据。但是由于我的经验有限,我无法在 Service 和 Activity 之间进行通信。我已经阅读了消息传递和广播接收器。并且正在寻找有关如何实施以获得我的结果或更好理解的想法。

根据我从尝试编码中收集到的信息,服务无法直接与我的界面交互,因此我需要以某种方式与我的活动进行通信。我读过的两种方式是消息传递(处理程序)和广播接收器。

这些方法中的每一种都可以发挥作用,但是有它们的缺点,这是我正在寻找更好的理解或帮助的地方。

对于处理程序:即使我可以创建一个静态处理程序类并在处理程序类中运行代码,因为它是静态的,我不能调用非静态对象,这意味着如果我尝试这样做它会失败。

服务:

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() 在我的 Activity 中,而不是单独的服务时,我只是直接调用 doThis() 并且效果很好。对于 BroadcastReceiver:有很多代码要显示,所以我将只解释我的问题,您也许可以从中回答。显然你必须在 onResume()/onPause() 上注册/取消注册。这将阻止我在手机进入睡眠状态时处理信息。

在我做“LiveListeners”之前它工作得很好,只要活动在前台并且手机没有睡觉。让它在睡觉时工作的唯一方法是让服务在后台工作。

所以我的问题是,处理这种情况的最佳方法是什么,以便我可以在手机处于睡眠状态时处理可穿戴设备发送到手机的信息。还是有另一种方法可以发送我没有找到的数据?

4

2 回答 2

1

如果您扩展WearableListenerService,您正在创建一个特殊的Service,它作为您应用程序进程的一部分运行。您可以使用它与Service您的应用程序中执行所有处理的另一个通信,或使用广播(如您所述。)在任何一种情况下,它Service都在您的进程上下文和主线程上运行 - 所以如果您需要进行任何繁重的处理,您需要将其卸载到后台线程。

由于您WearableListenerService在清单中声明,并且其生命周期由 Android Wear 管理(默认情况下),因此创建辅助节点Service或使用 aBroadcastReceiver进行处理将是最简单的。请注意,如果在 BR 中,“处理”必须是轻量级的。如果您使用 BR,请考虑使用它,LocalBroadcastManager因为它比通过通常的Context.sendBroadcast(). 这大致相当于向您的应用程序发送消息,它恰好是Intent形式。

于 2016-12-28T14:19:02.487 回答
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 回答