========================================================================
1.Activity 怎么和 Service 绑定,怎么在 Activity 中启动自己对应的Service?
Activity 通过 bindService(Intent service, ServiceConnection conn, int flags)跟 Service 进行绑定,当绑定成功的时候 Service 会将代理对象通过回调的形式传给 conn,这样我们就拿到了Service 提供的服务代理对象。
在 Activity 中可以通过 startService 和 bindService 方法启动 Service。一般情况下如果想获取Service 的服务对象那么肯定需要通过 bindService()方法,比如音乐播放器,第三方支付等。如果仅仅只是为了开启一个后台任务那么可以使用 startService()方法。
Service 有绑定模式和非绑定模式,以及这两种模式的混合使用方式。不同的使用方法生命周期方法也不同。
-
非绑定模式:当第一次调用 startService 的时候执行的方法依次为 onCreate() 、onStartCommand(),当Service 关闭的时候调用 onDestory 方法。
-
绑定模式:第一次 bindService()的时候,执行的方法为 onCreate()、onBind()解除绑定的时候会执行onUnbind()、onDestory()。
上面的两种生命周期是在相对单纯的模式下的情形。我们在开发的过程中还必须注意 Service 实例只会有一个,也就是说如果当前要启动的 Service 已经存在了那么就不会再次创建该 Service 当然也不会调用 onCreate()方法。
一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了 onBind()方法后该Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户都执行了 unBind()该 Service 也不会销毁。
3.Activity、Intent、Service 是什么关系
他们都是 Android 开发中使用频率最高的类。其中 Activity 和 Service 都是 Android 四大组件之一。他俩都是 Context 类的子类ContextWrapper 的子类, 因此他俩可以算是兄弟关系。
-
Activity 负责用户界面的显示和交互
-
Service 负责后台任务的处理。
Activity 和 Service 之间可 以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。
4.Service 是否在 main thread 中执行, service 里面是否能执行耗时的操作?
- 默认情况,如果没有显示的指 servic 所运行的进程, Service 和 activity 是运行在当前 app 所在进程的 main thread(UI 主线程)里面。service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件)
特殊情况 ,可以在清单文件配置 service 执行所在的进程 ,让 service 在另外的进程中执行
<service
android:name=“com.baidu.location.f”
android:enabled=“true” android:process=“:remote” >
对于同一 app 来说默认情况下是在同一个线程中的,main Thread (UI Thread)。
可以的。弹吐司有个条件就是得有一个 Context 上下文,而 Service 本身就是 Context 的子类,因此在 Service 里面弹吐司是完全可以的。比如我们在 Service 中完成下载任务后可以弹一个吐司通知用户。
7.在 service 的生命周期方法 onstartConmand()可不可以执行网络操作?
可以直接在 Service 中执行网络操作,在 onStartCommand()方法中可以执行网络操作
8.什么是 Service 以及描述下它的生命周期。Service 有哪些启动方法,有什么区别,怎样停用 Service?
在 Service 的生命周期中,被回调的方法比 Activity 少一些,只有 onCreate,onStart, onDestroy, onBind 和 onUnbind。
通常有两种方式启动一个 Service,他们对 Service 生命周期的影响是不一样的。
1. 通过 startService
Service 会经历 onCreate 到 onStart,然后处于运行状态,stopService的时候调用 onDestroy方法。 如果是调用者自己直接退出而没有调用 stopService 的话,Service 会一直在后台运行。
2. 通过 bindService
Service 会运行 onCreate,然后是调用 onBind, 这个时候调用者和 Service绑定在一起。调用者退出了,Srevice 就会调用 onUnbind->onDestroyed 方法。
所谓绑定在一起就共存亡了。调用者也可以通过调用 unbindService 方法来停止服务,这时候Srevice 就会调用onUnbind->onDestroyed 方法。
需要注意的是如果这几个方法交织在一起的话,会出现什么情况呢?
一个原则是 Service 的 onCreate 的方法只会被调用一次,就是你无论多少次的 startService 又bindService,Service 只被创建一次。
- 如果先是 bind 了,那么 start 的时候就直接运行 Service 的 onStart 方法,如果先是 start,那么
bind的时候就直接运行 onBind 方法。
- 如果 service 运行期间调用了 bindService,这时候再调用 stopService 的话,service 是不会调用
onDestroy 方法的,service 就 stop 不掉了,只能调用 UnbindService, service 就会被销毁
- 如果一个 service 通过 startService 被 start 之后,多次调用 startService 的话,service
会多次调用 onStart 方法。多次调用 stopService 的话,service 只会调用一次 onDestroyed 方法。
- 如果一个 service 通过 bindService 被 start 之后,多次调用 bindService 的话,service
只会调用一次 onBind 方法。 多次调用 unbindService 的话会抛出异常。
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
如果你觉得这些内容对你有帮助,可以扫码获取!!(备注:Android)
![](https://i-blog.csdnimg.cn/blog_migrate/2c9161f27fe07a39bfae0d3ea23f03c6.jpeg)
最后
如果你看到了这里,觉得文章写得不错就给个赞呗?如果你觉得那里值得改进的,请给我留言。一定会认真查询,修正不足。谢谢。
最后针对Android程序员,我这边给大家整理了一些资料,包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!
于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
《互联网大厂面试真题解析、进阶开发核心学习笔记、全套讲解视频、实战项目源码讲义》点击传送门即可获取!