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

Nam*_*912 5 android android-service android-activity

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

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

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

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

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

让我知道你的想法!

And*_*rry 3

您的活动应该向服务注册在AIDL中实现的侦听器,并且服务应该将它们维护在 RemoteCallbackList

您的服务应该有两个这样的方法,供您的 Activity 在 onResume/onPause 中调用

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


public void unregisterListener(IYourListenerInterface listener) {
     callbackList.unregister(listener);
}
Run Code Online (Sandbox Code Playgroud)

当您需要发送消息时:

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();
Run Code Online (Sandbox Code Playgroud)