Android - 经常启动IntentService



在我的应用程序中,类的单个实例就像状态机一样。许多活动都希望接收有关此对象状态的更新。此对象本身的状态是从某些原始信息的广播数据更新的。

我以这种方式实现它。我在清单文件中注册了一个广播接收器,该文件接收原始信息,然后启动一个 IntentService 只是传递接收到的信息。

@Override
public void onReceive(Context context, Intent intent) {
    Intent update_service = new Intent(context, StateMachineUpdateService.class);
    update_service.putExtra(PRIMITIVE, intent.getDoubleExtra(PRIMITIVE, 0));
    context.startService(update_service);
}

StateMachineUpdateService 保留一个实例并更新它:

@Override
protected void onHandleIntent(Intent intent) {
        statemachine.update(intent.getDoubleExtra(PRIMITIVE, 0));
        Intent broadcast = new Intent(STATE_MACHINE_UPDATE);
        broadcast.putExtra(STATE_MACHINE_STATE, statemachine.get_state());
        this.sendBroadcast(broadcast);
    }
}

我想知道是否有更优雅的方式来实现这一目标。我想知道启动意图服务(反过来将启动一个单独的线程)是否是我应该尽量避免的事情。基元广播在一秒钟内发送大约 10 次。

附带问题:

假设Statemachine.Update花费了太多时间,以至于下一次广播已经到来,我想忽略这些广播。最好的方法是什么?

如果你有一个需要对其成员进行序列化访问的单一实例对象,一种方法是使用 HandlerThread 并计划来自接收器或其他任何可能产生工作的地方对其的传入工作。 HandlerThread 将按照接收的顺序处理所有内容(可运行或消息)(就像 Android 主线程一样)。

如果要跳过传入的工作项,可以记录工作的接收时间,并将其与实际执行时间进行比较,如果超过某个阈值,则跳过它。

启动意图服务在我的 1 GHz 手机上需要 1-15 毫秒。由于它是在 UI 线程 10 上创建的,因此调用甚至可能需要 100 毫秒,这太多了(用户会遇到延迟)。您应该考虑将Hanlder与WorkerThread一起使用。您可以检查 IntentService 如何使用此解决方案并在您的案例中实现它。

最新更新