在Android应用程序(API级别14及更高版本)中,该应用程序具有由不同活动使用的服务(它们使用本地绑定调用其功能),该服务计算60 Hz的游戏元素的位置(坐标) 。 [我有充分的理由在服务中进行计算,而不仅仅是直接在活动中进行计算]。服务(用于游戏逻辑检查)和播放屏幕活动(用于绘图)中需要这些连续的位置更新。
我的问题是:为此方案选择服务到活动通信的选项是什么?我想最小化服务计算新位置的时间点与UI(活动)已知的时间点之间的毫秒延迟(最多几乎没有延迟)。
您可以假设所有事项(活动,服务)都在一个过程中。
我正在考虑一个解决方案,每个活动在恢复时告诉服务它的存在(并且在onPause()活动告诉服务它们的不可用性),以便服务在计算新坐标时,可以简单地检查活动是否可见,如果是,则直接调用visibleActivity.someMethod()。 据了解,.someMethod()内部将控制权移交给UI线程。
我建议这样做,因为我确信通过广播进行会破坏性能。
让我知道你的想法!
答案 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按钮)。
我有充分的理由在服务中进行计算,而不仅仅是直接在活动中进行计算
说实话,我无法想象这些原因是什么。