现在的位置: 首页 > 综合 > 正文

为什么单起一个service而不是直接在Activity里用thread或者asynctask来load图片那?

2018年09月18日 ⁄ 综合 ⁄ 共 1882字 ⁄ 字号 评论关闭

和朋友通电话,他问了我这么个问题,一时语塞...

有太多显而易见的问题背后都有一段让你恍然大悟的知识微笑

留贴。

明天答。

这个问题的实质就是ANDROID进程优先级。

在ANDROID系统中,进程优先级从高到低共分为以下几个类别。

1. 前台进程

前台进程就是用户当前正在使用的进程,这些进程只有在内存极度小,小到系统无法运行的时候才会被杀掉。

下面这些为前台进程:

(1)进程中包含处于前台的并且与用户交互的Activity.

(2)进程中包含与前台Activity交互的Service.

(3)进程中包含了调用setForeground()的Service.

(4)进程中包含正在执行onCreate() onStart() onDestroy()的Service.

(5)进程中包含正在执行onReceive()方法的 BroadCasterReceiver.

2. 可见进程

可见进程是没有任何前台的可见组件,但是仍然可以影响到用户的所见。

(1)进程中包含不在前台但仍然可见的Activity.比如一个Activity弹出对话框后,此Activity虽然不在前台了但是它仍然可见。

(2)进程中包含绑定到可见Activity的Service。

可见进程拥有比较高的优先级,它被杀掉只能是为了保证前台可见Activity能正常运行。

3. 服务进程

一个正在运行由startService()启动的Service的进程,并且不属于以上两种情况的进程就是服务进程。虽然服务进程不与任何可见的Activity绑定,但是它们却承担着许多和用户息息相关的重要活动,比如播放音乐和从网络上下载数据,我朋友提的这个下载图片也是这种情况。因为它们足够重要,所以系统会让他们继续运行,直到系统不能同时维持前台进程,可见进程和服务进程的时候,系统才会把服务进程杀掉。

4. 后台进程

一个进程包含有不再可见的Activity,这个进程对用户来讲不会产生什么直接影响,系统可以在任意时刻杀掉他们来回收内存以维持上面几个进程的运行。通常我们的手机里会有许多后台进程,它们都存放在LRU表里,以保证用户最常见的Activity最后被杀死。如果一个正确实现了生命周期方法的Activity,保存了自己的状态,当这个Activity在后台被杀死时,它可以在用户重新进入时候,恢复状态。

5. 空进程

不包含任何活动的进程是空进程,空进程存在的唯一目的就是缓存,以便下次更快的启动。系统经常杀掉空进程来平衡进程缓存和内核缓存间的资源。

现在我想我的答案应该很明显了吧,如果在Activity用thread来load图片,当Activity不可见后,它就变成了后台进程。这样一来很容易在内存小的时候被系统杀掉。

而用Service的话,保证了这个操作至少拥有“服务进程”的级别,进程级别高,不容易被杀掉,而且系统会分配给足够的内存,运行效率也高。

也不知道全不全面,暂时我理解就是这个样子。

Answer from Android developer:

Because a process running a service is ranked higher than a process with background activities, an activity
that initiates a long-running operation might do well to start a 
service for
that operation, rather than simply create a worker thread—particularly if the operation will likely outlast the activity. For example, an activity that's uploading a picture to a web site should start a service to perform the upload so that the upload can
continue in the background even if the user leaves the activity. Using a service guarantees that the operation will have at least "service process" priority, regardless of what happens to the activity. This is the same reason that broadcast receivers should
employ services rather than simply put time-consuming operations in a thread.

晚安。

抱歉!评论已关闭.