4000-520-616
欢迎来到免疫在线!(蚂蚁淘生物旗下平台)  请登录 |  免费注册 |  询价篮
主营:原厂直采,平行进口,授权代理(蚂蚁淘为您服务)
咨询热线电话
4000-520-616
当前位置: 首页 > 新闻动态 >
新闻详情
Android面试回忆录:Service有几种启动方式?_chuhe1989的博客-CSDN...
来自 : CSDN技术社区 发布时间:2021-03-24

这是我印象深刻的一道题 很明显它是我的第一次 那时我去一家公司 暂时叫它T公司吧 面试外派到韩国三星的工作机会。T公司的面试官是一个叫Bely架构师 显然那个时候Android开发是稀缺资源 知道Service那都不得了了 当然Bely也没打算为难我 必竟也工作4年多了 人长得也不错 我轻松对答

Service是一个专门在后台处理长时间任务的Android组件 它没有UI。它有两种启动方式 startService和bindService。

你猜得没错 Bely紧接着问我 这两种启动方式的区别。

startService只是启动Service 启动它的组件 如Activity 和Service并没有关联 只有当Service调用stopSelf或者其他组件调用stopService服务才会终止。
bindService方法启动Service 其他组件可以通过回调获取Service的代理对象和Service交互 而这两方也进行了绑定 当启动方销毁时 Service也会自动进行unBind操作 当发现所有绑定都进行了unBind时才会销毁Service。

这应该是比较关键的区别了 在面试前我刚刚用Serivce做过一个音乐播放器。几年后 我在深圳面试过很多人 他们中有60-70%的人没有使用Service的经验 让我一度感觉得深圳这座城市做Android开发的比较浮躁。因为这儿工作机会太多了 初级的开发者都比较急功近利 不需要在自己身上下太多的功夫也可以找到工作 当然这是片面的认识 。

当然还有其他的区别 如两种调用对Service生命周期函数影响 面试官也可以就这个问题展开一下。

\"\"

当我遇到面试者知道怎么使用Service 也如多年前的我可以自如的答出startService和bindService的区别时 我一般会多问一句

Service的onCreate回调函数可以做耗时的操作吗

很多人都会说 可以。

原形毕露 他前面的回答只是在面试前预习了一下面试题而已。如果知道Service的onCreate是在主线程 ActivityThread 中调用的 耗时操作会阻塞UI 我一般再接着问

如果需要做耗时的操作 你会怎么做

问题便这样展开了 一个人是否真正懂得原理会灵活运用 一下子便能看出来。 当面试者回答到线程和Handler方式时 我会再问一下对方:

是否知道IntentService 在什么场景下使用IntentService

这也是面试官要看的点 真正的项目需要一个开发人员对某个问题有一定的深度 也需要对整个Android的知识点有一定的广度。深度代表这个人对问题认真对待有钻研的精神 广度代表这个人在面对同一个问题时 会更容易从多种可行的方案中选出最合适的一种。

Service的实际项目中一直被很多人忽略 为什么我一再强调Service很重要 我们来看看 如果对Service完全无知会在工作中遇到什么问题。

场景 如果一个应用要从网络上下载MP3文件 并在Activity上展示进度条 这个Activity要求是可以转屏的。那么在转屏时Actvitiy会重启 如何保证下载的进度条能正确展示进度呢

没有Service概念的人 一般想出来的方案如下

在转屏前将进度缓存 转屏后再读出来。使用android:configChanges设置 让转屏时Activity不销毁和重建。

针对第1个方案 我会继续问他将进度值存在哪里 转屏的过程中 我们知道Activity的重建算是比较耗时的 会可能会有几百毫秒以上 那么这时候下载线程仍然在工作 进度肯定和保存时的进度不一致了 如何处理这个问题呢

第2个方案 大家可以自己展开思考 实际的项目中可能会需要额外做一些事情来处理ContentView的横竖布局的问题。

如果使用Service来解决这个问题 看似是比较完美的 不过就会涉及Activity UI 和Service的交互问题 这个我们以后再讨论。

小结

当我们知道了Service的用途 心中有一个Service相关的概念时 针对实际的场景还是要做具体的分析再决定是否使用Service。因为Service仍然是在主线程中调用 还是要开线程才能处理长时间的工作 Service和UI的交互也让这个方式变得不那么简便。如果你只需要在当前界面去做一些耗时操作 界面退出或改变时 工作也要停止 那么这时直接使用Thread 或者AsyncTask, ThreadHandler 会更合适你。

作者 goeasyway
链接 https://www.jianshu.com/p/7a7db9f8692d

本文链接: http://service89.immuno-online.com/view-708079.html

发布于 : 2021-03-24 阅读(0)
公司介绍
联络我们
服务热线:4000-520-616
(限工作日9:00-18:00)
QQ :1570468124
手机:18915418616