Android - 频繁启动 IntentService

Android - starting IntentService frequently

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

我是这样实现的。 我在接收原始信息的清单文件中注册了一个广播接收器,然后启动一个仅传递接收到的信息的 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);
    }
}

我想知道是否有更优雅的方法来实现这一点。我想知道启动一个 IntentService(这反过来将启动一个单独的线程)是否是我应该尽量避免的事情。原语广播一秒发送10次左右

附带问题:

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

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

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

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