5

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

我的问题是:在这种情况下,服务到活动通信的选项是什么?我想将服务计算新位置的时间点与 UI(活动)已知的时间点之间的毫秒延迟(充其量,几乎没有延迟)最小化。

您可以假设一切(活动、服务)都在一个过程中。

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

我建议这样做,因为我确信通过广播应该会降低性能。

让我知道你的想法!

4

2 回答 2

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();
于 2012-12-11T10:21:49.477 回答
1

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

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

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

于 2012-12-11T12:07:10.553 回答