Service-Activity 休眠时通讯数据处理

Service-Activity Communication data processing while sleep

项目声明:

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

工作原理:

穿戴设备通过 Wearable.MessageApi.sendMessage() 向手机发送消息,phone 以 Wearable.DataApi.putDataItem() 响应。除了它所引用的项目之外,手表还发送多种形式的信息,例如 add/subtract/countRequest。手机只响应所请求的项目计数,如果它与显示的值不同,手表只需要更改显示。

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

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

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

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

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

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

服务:

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

Activity:

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

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

有没有一种方法可以实现上述处理程序,因为当我处理消息时,如果我只是简单地祝酒,它就可以工作,所以我可以接收到消息。我只是不能从静态调用非静态对象。所以我假设如果我只是将 doThis() 的代码放入 Handler 中,我也无法更新接口对象,因为我只是将它用作两者之间的过渡。当我使用 LiveListeners 并且 onMessageReceived() 在我的 Activity 中时,而不是单独的服务,我只是直接调用 doThis() 并且效果很好。 对于广播接收器: 有很多代码要显示,所以我将只解释我的问题,您也许可以从中回答。显然你必须 register/unregister onResume()/onPause()。这将阻止我在 phone 进入睡眠状态时处理信息。 运行 服务的全部意义在于,当 phone 处于睡眠状态或 activity 不在前台时,我可以做一些事情。

在我做 "LiveListeners" 之前它工作正常,只要 activity 在前台并且 phone 没有睡觉。让它在睡觉时工作的唯一方法是让服务在后台工作。

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

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

由于您的 WearableListenerService 在清单中声明并且其生命周期由 Android Wear 管理(默认情况下),创建辅助 Service 或使用a BroadcastReceiver 来做你的处理。请注意,如果在 BR 中,"processing" 必须是轻量级的。如果您使用 BR,请考虑使用 LocalBroadcastManager,因为它比通过通常的 Context.sendBroadcast() 发送广播更有效。它大致相当于向您的应用程序发送消息,它恰好是 Intent 形式。

我当然不想过于简单化,但我喜欢简单的方法。出于意图,我只是从睡眠中唤醒移动设备或可穿戴设备,然后其他线程也强制唤醒并处理数据。

   @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

的代码片段