Android 从活动开始在新线程中启动服务是一件好事吗

Android 从活动开始在新线程中启动服务是一件好事吗,android,service,locationlistener,Android,Service,Locationlistener,我必须在服务中执行后台位置更新。我在服务中使用过LocationListner,它经常调用onLocationChanged(),这会阻塞我的UI线程。如果在onLocationChanged()中使用create thread,则每次调用此方法时都会生成一个新线程。因此,我考虑在新线程中创建整个服务,而不是在onLocationChanged()中创建线程。这是一个好的解决方案还是最好的方法?非常感谢您的帮助。服务在其宿主进程的主线程中运行;除非您另行指定,否则服务不会创建自己的线程,也不会在

我必须在服务中执行后台位置更新。我在服务中使用过LocationListner,它经常调用onLocationChanged(),这会阻塞我的UI线程。如果在onLocationChanged()中使用create thread,则每次调用此方法时都会生成一个新线程。因此,我考虑在新线程中创建整个服务,而不是在onLocationChanged()中创建线程。这是一个好的解决方案还是最好的方法?非常感谢您的帮助。

服务在其宿主进程的主线程中运行;除非您另行指定,否则服务不会创建自己的线程,也不会在单独的进程中运行


然而,从不同的线程启动服务看起来很难看。您可以在服务中创建一个新线程。

如果您使用的是android的
IntentService
组件,它将自动在
OnHandleContent(…)中处理您的后台处理。
您可以尝试

new Thread(new Runnable(){
            @Override
            public void run () {
                Intent firstServiceIntent=new Intent(getApplicationContext(),MyService.class);
            }
        }).start();

否则,如果您使用
服务

  class YourService extends IntentService
您可以在
onCreate()中使用自定义线程

其他

该服务将在
主线程中运行


如果您希望您的服务在后台线程上运行,那么您有两个选项:

  • 使用安卓操作系统在后台线程上自动运行的
    IntentService
    。在
    IntentService
    中执行的所有操作都将在后台线程上运行。你不需要做任何线程

  • 使用标准安卓
    服务
    ,并在要执行工作的服务内实例化一个
    新线程()。标准的安卓
    服务
    默认在主线程上运行,因此它将阻止您的UI。这就是为什么你必须自己处理线程

  • 更多信息请点击此处:

    当我在活动和服务中尝试Thread.currentThread().getId()时,两者都产生了相同的id。因此我发现它们在同一个线程中工作,这是我不想要的。如果我错了,请纠正我。您使用的是哪种服务
    IntentService
    Service
    是一个组件,那么为什么要从后台线程启动它呢?最终,
    Service
    将在主线程上运行。在线程中启动服务不会在线程中运行服务。所以这没有意义。@Gabeschen这是有道理的。。谢谢:)
      class YourService extends Service