前台服务是否可以在主线程之外运行?

3
我是一名Android的新手,请耐心等待。我正在编写一个应用程序,使用前台服务在Service类中跟踪智能手机,并使用通知来确保该服务不会被操作系统杀死。除了发送坐标到服务器时出现的Networkonmainthreadexception异常,一切都很好。插入policy.permitall可以解决这个问题,但是我想使用一个单独的线程来解决它。然而,即使在新线程中启动前台服务(使用start()方法),我仍然收到网络异常。

由于长时间运行的服务,我将Asynctask作为第二选择。我尝试了IntentService,但由于GPS跟踪的原因,生成的代码结构并不是最好的。
以下是启动新线程的简单代码:

                    @Override
                    public void run() {
                        Intent rastreoIntent = new Intent(mContext, RastreoS.class );
                        rastreoIntent.setAction(RastreoS.ACTION_START_FOREGROUND_SERVICE);
                        startService(rastreoIntent);
                    }
                };
                t.start();

我的问题是:一个前台服务能否在主线程之外运行?即使在新线程中启动,通知是否与UI绑定,将前台服务绑定到主线程?


使用 WorkManager:https://developer.android.com/topic/libraries/architecture/workmanager - cutiko
1个回答

4

Service的生命周期方法(例如onStartCommand()),和Android上的其他组件(例如ActivityContentProviderBroadcastReceiver)一样,始终由系统在主线程上调用。(你可以选择让系统在另一个线程上调用BroadcastReceiver.onReceive(),但只有这个选项。)

即使您在工作线程上调用了startService(),实际的启动也是由框架异步地安排的,并且当主线程空闲时将在稍后发生,因此您的Service生命周期方法仍将在主线程上被调用。要将繁重的工作从主线程中移出,您需要修改Service实现中的代码。

由于您正在使用IntentService,它已经为您创建了工作线程,您只需要确保您的网络代码位于IntentService.onHandleIntent()内,该方法将在工作线程上运行。


好的,明白了。看来我会再试一下IntentService。谢谢你的时间! - Ivo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接