android - Android 服务是否从单独的线程而不是 UI 运行?

标签 android multithreading service

我目前正在使用警报管理器来启动将位置发布到 http 的服务。问题是当管理器启动并运行服务时,用户界面似乎停止了一段时间。我想问一下服务线程是否与ui线程分开?

最佳答案

澄清一下:应用程序的主线程并不总是 UI 线程。 例如:如果一个 Activity 停止,则调用 onStop(),因此 UI 线程将从该 Activity 中移出并移至相同或不同应用程序中的另一个 Activity。

但是,这并不意味着该应用程序不再处于 Activity 状态。此外,如果有(已启动的)服务在后台运行,它可能会继续运行一段时间,直到它终止或 Android 操作系统因资源不足而终止它。

在那段时间谁在运行这项服务?谁触发了 onStop() 或 onDestroy()?这是应用程序的主线程在做的。

UI 线程是一种单例。它一次只能被一个可见 Activity 使用。应用程序的主线程要么加入/附加到 UI 线程,要么另一个得到它。但这并不意味着应用程序没有自己的主线程。

此行为来自 Android 系统的 Linux\Unix 基础。大多数开发人员不知道:该应用程序是 Linux\Unix 操作系统中的“用户”。

每当调用应用程序时,它都类似于用户登录系统。在应用程序的情况下,用户 ID 是唯一的应用程序 ID,而无需密码。新登录的“用户”(即 Android 应用程序)获得进程和资源,例如 Java 虚拟机的实例。该进程专用于该用户,包括文件系统配额、文件描述符和处理程序在内的资源允许它与操作系统通信。

Android 应用程序的主线程是从 Android 操作系统移交给该应用程序的进程创建的根线程。在此应用程序中创建的任何新线程将始终返回到主线程。

应用程序的主线程可以访问的系统资源之一是 UI 线程。因此,应用程序可以请求主线程,但是该请求可能会被拒绝(或授予)。一个例子:如果应用程序进程超过了它允许的内存分配大小,Android OS 可能会决定拒绝访问 UI 线程,甚至销毁应用程序并终止进程。

可以通过 AndroidManifest.xml 中的定义为应用程序定义多个进程(Unix 进程分支)。但是请记住,分配给每个进程的资源是不同的,即每个进程都有自己的 VM,因此在不同进程中维护的对象将无法通过同一个 JVM 堆共享信息。

关于android - Android 服务是否从单独的线程而不是 UI 运行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875926/

相关文章:

android - 如何禁用 snackbar 的滑动关闭行为

android - 了解Android App认证

c++ - 将 vector 元素的引用传递给线程函数

Angular 2 构造函数注入(inject)与直接访问

android - 服务不显示日志

java - 一旦按下手机的后退按钮,ViewPager 不会生成 UI

android - 无法解决 : com. google.firebase :firebase-core:15. 0.0

java - 测量垃圾收集时间的阻塞部分

multithreading - 共享库中的 block Go 例程

android - Context.startForegroundService() 然后没有调用 Service.startForeground() - 仍然是一个问题