Android服务是从分离的线程而不是UI运行的吗?

eri*_*lee 34 service multithreading android

我目前正在使用alarmmanager启动服务以将位置发布到http.问题是当经理启动并运行服务时,ui似乎停了一会儿.我想问服务线程是否与ui线程分开?

小智 50

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

但是,这并不意味着此应用程序不再处于活动状态.此外,如果在后台运行(已启动)服务,它可能会持续一段时间,直到它终止或Android OS由于缺乏资源而终止它.

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

UI线程是一种Singleton.它一次只能由一个可见活动使用.应用程序的主线程连接/附加到UI线程或另一个获取它.但是,这并不意味着应用程序没有自己的主线程.

此行为来自Android系统的Linux\Unix基础.大多数开发人员不了解的内容:该应用程序是Linux\Unix OS中的"用户".

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

android应用程序的主线程是从Android OS移交给该应用程序的过程创建的根线程.在此应用程序中创建的任何新线程将始终返回到主线程.

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

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

  • 有点困惑 - 这里:http://android-developers.blogspot.de/2009/05/painless-threading.html谷歌说:"每当你第一次启动一个Android应用程序时,会自动创建一个名为"main"的线程.主线程,也称为UI线程[...],听起来像应用程序范围内的主线程== ui线程?有关此处"线程"部分的更多信息:http://developer.android.com/guide/components/processes-and-threads.html (6认同)
  • 以前从来不知道....我一直认为Application Main Thread是UI Thread .... (3认同)

Far*_*han 49

从Android文档复制:

警告:服务在其托管进程的主线程中运行 - 该服务不会创建自己的线程,也不会在单独的进程中运行(除非您另行指定).这意味着,如果您的服务要进行任何CPU密集型工作或阻止操作(例如MP3播放或网络),您应该在服务中创建一个新线程来完成这项工作.通过使用单独的线程,您将降低应用程序无响应(ANR)错误的风险,并且应用程序的主线程可以保持专用于用户与您的活动的交互.

服务概述

使用IntentService,如果你不想在自己的管理线程摆弄.或者使用AsyncTasks.

  • 嗨thx!我想我将在服务中使用asyntask :) (2认同)