如何同时启动和运行两个后台服务?

Posted

技术标签:

【中文标题】如何同时启动和运行两个后台服务?【英文标题】:How to start and run two background services at the same time? 【发布时间】:2018-08-09 05:34:43 【问题描述】:

我想点击“开始”按钮,以便应用程序可以同时启动和运行两个服务。 我创建了两个名为ServiceAServiceB 的服务。对于每项服务,我已经 创建了一个可运行的方法(在 onStartCommand 中)来逃避 ANR 问题。我还创建了一个开始按钮,这样当我点击开始按钮时,我希望ServiceAServiceB可以同时开始,或者说同步。

我尝试了很多方法。第一次尝试只是一个一个地启动服务,但是失败了:

startButton.setOnClickListener(new View.OnClickListener() 

    @Override
     public void onClick(View view) 

        Intent intent1 = new Intent(MainActivity.this, ServiceA.class);
        startService(intent1);

        Intent intent2 = new Intent(MainActivity.this, ServiceB.class);
        startService(intent2);

    
);

然后我打算尝试AsyncTask,但是由于服务是在后台使用处理程序运行的,如果我使用AsyncTask,它将创建另一个后台处理程序,这是不适用的。您有什么建议可以一键同时运行两个服务吗?

【问题讨论】:

不是。如果只有一个处理器,它一次只能执行一项任务。如果有多个处理器......也许你可以使用它,但不确定如何(或为什么)。两者启动时间很短,有什么问题? exactly the same time 你绝对不能期待这个。 您好 Stultuske 先生,问题是我尝试使用上述方式,但它只会运行 serviceA,我希望将 serviceA 和 serviceB 放在一次点击事件中,我认为这可能与线程同步问题,但由于我在android开发方面的经验有限,我不知道任何解决方案,是否可以使用executeOnexecuter来完成这项工作?感谢您的 cmets 【参考方案1】:

您需要研究 Java 并发和多线程。如果你想并行运行这两种方法,你必须使用线程...

Thread thread1 = new Thread(new Runnable() 
    @Override
    public void run() 
        codeHereWillRunConcurrentlyWithMainThread();
    
);
thread1.start();

Thread thread2 = new Thread(new Runnable() 
    @Override
    public void run() 
        codeHereWillAlsoRunConcurrentlyWithMainThread();
    
);
thread2.start();

但是,如果您的两个线程应该一起工作,您需要查看如何使用 java 内置的“同步”关键字。它用于防止多线程并发环境中的死锁,并防止变量/变量在其他线程对所述变量/变量进行操作时被修改。

更多信息: https://docs.oracle.com/javase/tutorial/essential/concurrency/ http://winterbe.com/posts/2015/04/07/java8-concurrency-tutorial-thread-executor-examples/ http://www.vogella.com/tutorials/JavaConcurrency/article.html

【讨论】:

嗨,乔 D,感谢您的回答。问题是 serviceA 用于收集智能手机上的传感器数据,serviceB 用于收集智能手机附近的 BLE 设备,所以我必须将这两个服务组合成一个单击事件,以便我可以同时收集传感器数据和 BLE 设备最后,我也考虑使用 Asynctask executeOnexecutor 来完成这项工作,但由于我对 android studio 的体验不佳,我不确定它是否有效。或者如果您对此有更多建议?最后,真的很感谢你的好意帮助!!! 不是问题人。您肯定在寻找异步调用。尝试异步任务。或者类似地,将线程中的方法同步到一个变量,该变量将它们锁定在当前线程。

以上是关于如何同时启动和运行两个后台服务?的主要内容,如果未能解决你的问题,请参考以下文章

如何让android的service一直在后台运行

手机和电脑的后台程序是否与前台程序同时运行 只是被前台覆盖了

如何在启动时在后台运行django服务器?

如何按需运行后台服务——而不是在应用程序启动或计时器上

如何始终在后台运行服务?

linux系统下如何从后台启动进程?