Android 如何防止onHandleIntent()-IntentService的多次调用

Android 如何防止onHandleIntent()-IntentService的多次调用,android,android-service,intentservice,Android,Android Service,Intentservice,当我启动服务(IntentService)时,它将调用onHandleIntent(),这是服务函数。当它运行时,如果我再次调用startService(),它将缓存调用,并再次调用onHandleIntent()。实际上,我想做的是,将一些新数据传递给当前正在运行的服务实例,而不创建其他服务实例。(如线程或侦听器中的信号)。 我该怎么做? 在我的onHandleIntent()中,我想使用而(true){….},因此它将永远运行。扩展普通服务类。在收到的第一个onStartCommand()上

当我启动服务(IntentService)时,它将调用onHandleIntent(),这是服务函数。当它运行时,如果我再次调用startService(),它将缓存调用,并再次调用onHandleIntent()。实际上,我想做的是,将一些新数据传递给当前正在运行的服务实例,而不创建其他服务实例。(如线程或侦听器中的信号)。 我该怎么做?
在我的onHandleIntent()中,我想使用
而(true){….}
,因此它将永远运行。

扩展普通服务类。在收到的第一个onStartCommand()上,启动一个后台线程,该线程包含“while(true){…}”代码。在此后的onStartCommand()调用中,检查工作线程是否存在,如果存在,则发出信号

如果不知道您将使用这项服务,很难给您提供更好的建议。但是,需要考虑的是: -查看IntentService也使用的Looper/Handler类。。他们可能会给你一些很好的方法来编码你的“while(true)”循环,包括信令。
-请记住,onStartCommand()方法应该在几秒钟内返回(它正在主线程上运行),因此如果您想移交新工作(通过onStartCommand中传递的意图接收到的工作),您应该确保移交不会花费太长时间。Looper/Handler类在这方面也可能对您有所帮助。

检查您的服务是否已启动,如果尚未启动:

private boolean isMyServiceRunning() {
    ActivityManager manager = (ActivityManager) this.getSystemService(Context.ACTIVITY_SERVICE);
    for (ActivityManager.RunningServiceInfo service : manager.getRunningServices(Integer.MAX_VALUE)) {
        if ("com.example.Service".equals(service.service.getClassName())) {
            return true;
        }
    }
    return false;
}