睡眠时的服务活动通信数据处理

时间:2016-12-28 14:00:39

标签: android wear-os android-messaging

项目声明:

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

工作原理:

磨损通过Wearable.MessageApi.sendMessage()向移动设备发送消息,电话以Wearable.DataApi.putDataItem()响应。手表发送多种形式的信息,如add / subtract / countRequest,以及它引用的项目。移动设备仅响应所请求的项目数,如果显示的值与显示的值不同,则只需更改显示。

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

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

听众的工作原理。现在我想对侦听器做一些有用的事情,因为它实际上是在发送我需要的数据。但由于我的经验有限,我在服务和活动之间的沟通方面遇到了麻烦。我已经阅读了消息和广播接收器。我正在寻找有关如何实现以获得我的结果或更好理解的想法。

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

这些方法中的每一种都会起到这个作用,但是它有它们的缺点,这就是我希望更好地理解或帮助的地方。

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

服务:

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();  
}

有没有办法可以实现上面的处理程序,因为当我处理消息时,如果我只是简单地做一个吐司,它可以工作,所以我可以收到消息。我不能从静态调用非静态对象。所以我假设我无法更新接口对象,如果我只是在Handler中抛出doThis()的代码,因为我只是在它之间使用它。当我使用LiveListeners并且onMessageReceived()在我的Activity中,而不是单独的服务时,我直接调用了doThis()并且它工作得很好。 对于BroadcastReceiver: 有很多代码要显示,所以我只是解释我的问题,你可以从中回答。显然你必须在onResume()/ onPause()上注册/取消注册。这将阻止我在手机进入睡眠状态时处理信息。运行服务的全部意义在于,当手机处于睡眠状态或活动不在前台时,我可以执行操作。

在我做“LiveListeners”之前,它工作正常,只要活动在前台,电话没有睡觉。在睡觉时让它工作的唯一方法就是让服务在后台工作。

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

2 个答案:

答案 0 :(得分:1)

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

由于您的Service在清单及其生命周期中声明了Android Wear(默认情况下),因此最简单的方法是创建辅助BroadcastReceiver或使用{ {1}}进行处理。请注意"处理"如果在BR,必须是轻量级的。如果您使用BR,请使用LocalBroadcastManager,因为它比通过通常Context.sendBroadcast()发送广播更有效。它大致相当于向您的应用发送消息,它恰好是Intent形式。

答案 1 :(得分: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

的代码段