当年他问我service,我是这样回答的

二. 启动 Service 的 的2 种方式

2.1 startService() 方法开启 Service

步骤:

  • a.定义一个类继承 Service。
  • b.在 AndroidManifest.xml 文件中配置该 Service。
  • c.使用 Context 的 startService(Intent)方法启动该 Service。
  • d.不再使用该 Service 时,调用 Context stopService(Intent)方法停止该 Service。
2.2 bindService 方法开启 Service(Activity 与 Service 绑定)

步骤:

  • a.创建 BinderService 服务端,继承自 Service 并在类中创建一个实现 IBinder 接口的实现
    实例对象并提供公共方法给客户端调用。
  • b.从 onBind()回调方法返回此 Binder 实例。
  • c.在客户端中,从 onServiceConnected 回调方法接收 Binder,并使用提供的方法调用绑定
    服务。

三.Service的生命周期

服务的生命周期有两种,因为服务可以跟 Activity 绑定起来,也可以不绑定,Activity和服务进行通信的话,是需要把服务和 Activity 进行绑定的。因此服务的生命周期分为未绑定 Activity 的和绑定 Activity 的。

没有绑定 Activity 的服务生命周期图:

绑定 Activity 的服务生命周期图:

1.通过 Intent 和 startService()方法启动了一个服务,接下来执行 onCreate()方法,首次创建服
务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand()onBind()之前)。如果服务已在运行,则不会调用此方法。

2.当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf()stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)

3.服务开始处于运行状态。

4.某个操作导致服务停止,比如执行了方法 stopService(),那么服务接下来会执行onDestory()销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

5.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

6.通过 Intent 和 bindService()方法启动了一个服务,接下来会执行 onCreate()方法,首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand()onBind() 之前)。如果服务已在运行,则不会调用此方法。

7.当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务
进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回 null。

8.服务开始处于运行状态。成功与 Activity 绑定。

9.某个操作导致服务解除绑定,比如执行了方法 unbindService(),那么服务接下来会解除与
当前 Activity 的绑定。接下来服务将面临销毁。

10.服务执行 onDestory()方法被销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

11.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

关于服务,总结一下:

a. 被启动的服务的生命周期:
如果一个 Service 被某个 Activity 调用 Context.startService方法启动,那么不管是否有 Activity 使用 bindService 绑定或 unbindService 解除绑定到该
Service,该 Service 都在后台运行。如果一个 ServicestartService 方法多次启动,那么onCreate 方法只会调用一次,onStart 将会被调用多次(对应调用 startService 的次数),并且系统只会创建 Service 的一个实例(因此你应该知道只需要一次 stopService 调用)。该Service 将会一直在后台运行,而不管对应程序的 Activity 是否在运行,直到被调用stopService,或自身的stopSelf 方法。当然如果系统资源不足,android 系统也可能结束服务。

b. 被绑定的服务的生命周期:
如果一个 Service 被某个 Activity 调用 Context.bindService方法绑定启动,不管调用 bindService 调用几次,onCreate 方法都只会调用一次,同时onStart 方法始终不会被调用。当连接建立之后,Service 将会一直运行,除非调用Context.unbindService 断开连接或者之前调用 bindService 的 Context 不存在了(如
Activity 被 finish 的时候),系统将会自动停止 Service,对应 onDestroy 将被调用。

c. 被启动又被绑定的服务的生命周期:
如果一个 Service 又被启动又被绑定,则该 Service将会一直在后台运行。并且不管如何调用,onCreate 始终只会调用一次,对应 startService调用多少次,Service 的 onStart 便会调用多少次。调用 unbindService 将不会停止 Service,而必须调用 stopService 或 Service 的 stopSelf 来停止服务。

d. 当服务被停止时清除服务:
当一个 Service 被终止
1、调用 stopService
2、调用stopSelf
3、不再有绑定的连接(没有被启动))时,onDestroy 方法将会被调用,在这里你应当做一些清除工作,如停止在 Service 中创建并运行的线程。

特别注意:
1、你应当知道在调用 bindService 绑定到 Service 的时候,你就应当保证在某处调用unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自动解除,并且 Service 会自动停止);

2、你应当注意 使用 startService 启动服务之后,一定要使用 stopService 停止服务,不管你是否使用 bindService;

3、同时使用 startServicebindService 要注意到,Service 的终止,需要 unbindServicestopService 同时调用,才能终止 Service,不管 startServicebindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如 Activity 被 finish 的时候)之后服务才会自动停止;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助

因此我收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
n.net/topics/618165277)

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 20
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,以下是一个简单的在 Service 中实现定位的 Android 代码示例: 1. 添加权限到 AndroidManifest.xml 文件中: ```xml <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> ``` 2. 在你的 Service 类中创建一个 LocationManager 对象: ```java LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE); ``` 3. 创建一个 LocationListener 对象: ```java LocationListener locationListener = new LocationListener() { @Override public void onLocationChanged(Location location) { // 处理位置变化事件 } @Override public void onStatusChanged(String provider, int status, Bundle extras) { // 处理位置状态变化事件 } @Override public void onProviderEnabled(String provider) { // 处理位置提供器启用事件 } @Override public void onProviderDisabled(String provider) { // 处理位置提供器禁用事件 } }; ``` 4. 在 Service 的 onStartCommand() 方法中请求位置更新: ```java // 定位精度 float accuracy = 100.0f; // 最小更新时间(毫秒) long minTime = 1000; // 最小更新距离(米) float minDistance = 10.0f; // 请求位置更新 locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, minTime, minDistance, locationListener); ``` 5. 在 Service 的 onDestroy() 方法中停止位置更新: ```java // 停止位置更新 locationManager.removeUpdates(locationListener); ``` 请注意,这只是一个简单的定位代码示例,实际上,你需要处理许多异常和错误情况,以确保你的应用程序在各种情况下都能正常工作。另外,如果你需要在 Service 中持续定位,你可能需要考虑使用 Foreground Service,以确保你的应用程序在后台运行时不被系统杀死。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值