关于Server的一个问题

来源:互联网 发布:php怎么文件上传 编辑:程序博客网 时间:2024/06/14 04:25

关于Server的一个问题

这是我无意中在一个帖子里看到的,感觉这个问题对于刚刚接触android的人来说很普遍,而且帖子的回复着实“美丽”,所以借过来放到这里希望更多地android初学者看到
【注】Server是运行在主线程中的

问题

引自

我知道在AIDL的时候需要用到service。除了这种情况,如果我的程序不需要与其他应用共享内存,那么service还有什么用啊?在网上看到介绍说:service是运行在后台的应用,对于用户来说失去了被关注的焦点。这就跟我们打开了音乐播放之后,便想去看看图片,这时候我们还不想音乐停止,这里就会用到service;又例如,我们打开了一个下载链接之后,我们肯定不想瞪着眼睛等他下载完再去做别的事情,对吧?这时候如果我们想手机一边在后台下载,一边可以让我去看看新闻啥的,就要用到service。
其实在service中,耗时的操作还是要放在Thread中。那为什么我不直接在activity中启动一个子线程,干嘛要先启动一个service然后再service中启动一个Thread去做耗时的操作呢?

回答

你没有将android 组件和android C/S架构的概念理解清楚,不仅没有理解清楚,还把组件的概念,跟线程、进程混淆在一起了。
我将android比喻成一栋办公大楼,android 中进程就是一个办公室,线程就是办公室里面的员工,办公室是不能干活的,而真正干活的是这个办公室里面的员工。一个员工只能在一个办公室里面干活,而一个办公室可以有很多员工。
Android的老板希望它的公司能办理的井井有条,于是针对每一种职能专门设立管理部门,例如WMS,负责窗口管理的,例如MPS,负责多媒体播放的。
一个部门可以有一个或多个办公室,一个办公室也可以有多个部门。而android的管理部门往往是不干什么实事的,就像我们的天朝的猿类,你推它一下,它才动一下。所以android需要一些干实事的部门,做对外客户的,这些部门我们统称为apk。Android中有好多这种部门,于是为了防止这些部门瞎干,又把部门分成Activity、Service、BrocastReceiver、ContentProvider四种子部门,这些子部门就是用来跟其它部门做沟通的,而所有的子部门运作时都会由大管家AMS来记录在案。
Activity,做门面的。
Service,做对外支持的。
BrocastReceiver,做门卫收信的。
ContentProvider,做仓库管理的。
做门面的,可以做对外支持的活,也可以做仓库管理的活。但是外面可不这么认为,它想找你要数据,只会找ContentProvier,找对外支持只会找Service。
另外AMS大管家有个不好的习惯,它为了节省公司的资源,AMS那里没有你这个apk任何部门运行记录的时候,它有可能把你的电关了(杀进程)。
而LZ你描述的问题呢,就是你的部门想下载东西,是由Activity子部门去干呢,还是Service去干。我的说法,都可以,但是,AMS那个不好的习惯,你没有任何Service运行,而Activity又退到后台了,那就会把你的进程杀了。

0 0
原创粉丝点击