- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我是 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 上的其他组件(例如Activity
、ContentProvider
, BroadcastReceiver
), 总是在你的主线程上被系统调用。 (您可以选择告诉系统在另一个线程上调用您的 BroadcastReceiver.onReceive()
,仅此而已。)
即使您在工作线程上调用 startService()
,实际的启动也是由框架异步安排的,并且稍后会在主线程空闲时发生,因此您的 Service
生命周期方法仍将在主线程上调用。要将繁重的工作移出主线程,您需要修改 Service
实现中的代码。
由于您使用的是 IntentService
,它已经在为你创建工作线程,你只需要确保你的网络代码在IntentService.onHandleIntent()
里面它将在工作线程上运行。
关于android - 主线程外的前台服务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57880976/
有人可以向我澄清主线 DHT 规范中的声明吗? Upon inserting the first node into its routing table and when starting up th
我正在尝试使用 USB 小工具驱动程序使嵌入式设备作为 MTP 设备工作。 我知道 Android 从大容量存储设备切换到 MTP 设备已经有一段时间了,并且找到了 source code for M
我是一名优秀的程序员,十分优秀!