gpt4 book ai didi

android - 主线程外的前台服务?

转载 作者:搜寻专家 更新时间:2023-11-01 09:19:19 26 4
gpt4 key购买 nike

我是 Android 的新手,所以请耐心等待。我正在编写一个应用程序,使用服务类中的前台服务跟踪智能手机,并发出通知以确保该服务不会被操作系统终止。除了向服务器发送坐标时出现的 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 中的通知是否会将前台服务绑定(bind)到主线程?

最佳答案

Service 的生命周期方法(例如onStartCommand()),就像Android 上的其他组件(例如ActivityContentProvider, BroadcastReceiver), 总是在你的主线程上被系统调用。 (您可以选择告诉系统在另一个线程上调用您的 BroadcastReceiver.onReceive(),仅此而已。)

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

由于您使用的是 IntentService ,它已经在为你创建工作线程,你只需要确保你的网络代码在IntentService.onHandleIntent()里面它将在工作线程上运行。

关于android - 主线程外的前台服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57880976/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com