Android-频繁启动IntentService

Android-频繁启动IntentService,android,performance,android-service,Android,Performance,Android Service,在我的应用程序中,类的单个实例的行为类似于状态机。许多活动都希望接收此对象状态的更新。这个对象本身的状态是从一些原始信息的广播数据中更新的 @Override public void onReceive(Context context, Intent intent) { Intent update_service = new Intent(context, StateMachineUpdateService.class); update_service.putExtra(PRIM

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

@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);
}
我是这样实施的。 我在清单文件中注册了一个广播接收器,它接收原始信息,然后启动一个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将按照接收的顺序处理所有内容(runnable或message)(就像Android主线程一样)


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

在我的1 GHz手机上启动IntentService需要1-15毫秒。由于它是在UI线程上创建的,所以10次调用甚至需要100毫秒,这太多了(用户将经历延迟)。你应该考虑使用HANLDER和WorkRead。您可以检查IntentService如何使用此解决方案,并在您的案例中实现它。

您不能在
广播接收器
中实例化
HandlerThread
,因为它的生命周期,
IntentService
在内部使用
HandlerThread
所以OP的方法似乎是正确的,您可以从Application.fair中将其实例化为一个单例,但使用Application对象对我来说总是很有味道。。。你可以在里面做任何事情,那么你需要什么样的服务呢?(IPC除外)应用程序经常用于单例初始化。IntentService最适用于可能需要未知时间且必须与主线程和任何活动分开的工作项。如果要在Application.onCreate中执行某些操作,可以查询ActivityManager以获取当前正在运行的进程的名称。