高频率的Android服务与活动之间的沟通:最佳选择?

时间:2012-12-11 10:17:01

标签: android android-activity android-service

在Android应用程序(API级别14及更高版本)中,该应用程序具有由不同活动使用的服务(它们使用本地绑定调用其功能),该服务计算60 Hz的游戏元素的位置(坐标) 。 [我有充分的理由在服务中进行计算,而不仅仅是直接在活动中进行计算]。服务(用于游戏逻辑检查)和播放屏幕活动(用于绘图)中需要这些连续的位置更新。

我的问题是:为此方案选择服务到活动通信的选项是什么?我想最小化服务计算新位置的时间点与UI(活动)已知的时间点之间的毫秒延迟(最多几乎没有延迟)。

您可以假设所有事项(活动,服务)都在一个过程中。

我正在考虑一个解决方案,每个活动在恢复时告诉服务它的存在(并且在onPause()活动告诉服务它们的不可用性),以便服务在计算新坐标时,可以简单地检查活动是否可见,如果是,则直接调用visibleActivity.someMethod()。 据了解,.someMethod()内部将控制权移交给UI线程。

我建议这样做,因为我确信通过广播进行会破坏性能。

让我知道你的想法!

2 个答案:

答案 0 :(得分:3)

您的活动应该将AIDL中实施的听众注册到服务中,而服务应该将其保留在RemoteCallbackList

您的服务应该有两个这样的方法可以被onResume / onPause中的活动调用

public void registerListener(IYourListenerInterface listener) {
     callbackList.register(listener);
}


public void unregisterListener(IYourListenerInterface listener) {
     callbackList.unregister(listener);
}

当您需要发送消息时:

int numOfListeners = callbackList.beginBroadcast();

for (int i = 0; i < numOfListeners; i++) {
    try {
        callbackList.getBroadcastItem(i).whatever();
    } catch (RemoteException e) {
        //ignore, listener probably gone
    }
}
callbackList.finishBroadcast();

答案 1 :(得分:1)

我会使用LocalBroadcastManager,或者可能使用Otto。与已经提出的解决方案(绑定和回调)相比,它们提供了更好的组件解耦。这很重要,因为活动可以根据用户操作来进行(配置更改,BACK按钮)。

  

我有充分的理由在服务中进行计算,而不仅仅是直接在活动中进行计算

说实话,我无法想象这些原因是什么。