Service 服务

Service 生命周期

**onCreate()**:这个方法在Service被创建时调用,只会在整个Service的生命周期中被调用一次,可以在这里进行一些初始化操作。(创建服务对象)
**onBind()**:当另一个组件通过调用bindService()与服务绑定时,系统将调用此方法,并且需要返回一个Binder实例。 不需要返回null。
**onStartCommand()**:此方法在Service被启动时调用。(服务创建完毕,启动服务,真正完成服务)
**onDestroy()**:当Service被销毁时调用,用于执行清理工作。(服务被销毁)

调用者调用的方法来管理 Service 的生命周期:

  • startService()
  • stopService()
  • bindService()
  • unbindService()

使用步骤

(1) 第一步:自定义 Service

创建一个自定义MyService 类继承 Service
重写父类的 onCreate()、onBind()、onStartCommand()、onDestroy()方法。

(2)第二步:在清单文件 AndroidManifest.xml 里面注册该服务组件

1
<service android:name=".MyService"/>

(3)第三步:启动服务

Service的启动方式主要有两种,分别是 startService() 和 bindService()

1. startService & stopService
onCreate – onStartCommand – onDestroy

2. bindService & unbindService
onCreate – onBind – onUnbind – onDestroy

onCreate -> onBind 这个时候调用者和 Service 绑定在一起
调用者调用 -> unbindService 方法
or
调用者 Context不存在了 (如Activity被finish了),Service就会调用onUnbind- >onDestroy。
这里所谓的绑定在一起就是说两者共存亡了

3. startService bindService & unbindServiced stopService
onCreate – onStartCommand – onBind – onUnbind – onDestroy

1、startService方法

1
2
3
4
5
6
7
//开启
Intent intent = new Intent(MainActivity.this,MyService.class);
startService(intent);

//关闭
Intent intent = new Intent(MainActivity.this,MyService.class);
stopService(intent);

2、 bindService 方法
需要在 onBind 方法返回一个 Binder 实例

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyService : Service() {
private val binder = MyBinder()

inner class MyBinder : Binder() {
fun doSomething(): String {
return "Hello from MyService!"
}
}

override fun onBind(intent: Intent): IBinder {
return binder
}
}

在 MainActivity 中创建连接服务的组件 ServiceConnection 类,重写 onServiceConnected()、 onServiceDisconnected() 方法。
通过调用 MyBinder 类中的 public 方法来实现 Activity 与 Service 的联系。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class MainActivity : AppCompatActivity() {
private lateinit var serviceConnection: ServiceConnection

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

serviceConnection = object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, service: IBinder) {
// 获取服务实例
val myService = MyService.MyBinder(service)
// 调用服务的方法
myService.doSomething()
}

override fun onServiceDisconnected(name: ComponentName) {
// 服务断开连接时的操作
}
}

// 启动服务
val intent = Intent(this, MyService::class.java)
bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE)
}

override fun onDestroy() {
super.onDestroy()
// 解除绑定服务
unbindService(serviceConnection)
}
}

使用场景

Service是Android中的一个四大组件,用于在后台执行长时间运行的操作或处理与应用程序无关的任务。
Service适用于以下场景:

  1. 后台任务处理:Service适合用于执行一些需要长时间运行的后台任务,例如下载文件、上传数据、定期更新应用内数据等操作。
  2. 音乐播放 :在音乐播放器应用中,通常会使用 Service 来播放音乐,即使用户切换到其他应用或锁屏,音乐播放仍在后台继续。
  3. 网络连接:在应用中需要进行网络请求或保持长时间的网络连接时,可以使用Service来处理网络通信。
  4. 后台定位服务:需要持续获取用户位置信息或实现位置追踪功能时,可以使用Service在后台获取位置信息。
  5. 消息推送服务:用于接收后端推送的消息通知,弹出通知栏通知或执行相关逻辑。
  6. 执行定时任务:Service可以用来执行定时任务,例如定时检查更新、发送定时提醒等。
  7. 处理离线数据同步:当需要在后台处理离线数据同步或数据备份时,可以使用Service来处理相关任务。

总的来说,Service适用于需要在后台长时间执行操作或处理与用户界面无关的任务的场景。通过Service,可以使应用程序具有后台运行、持续运行的能力,提高用户体验和应用功能的完整性。

启动方式选择

如果你只是想要启动一个后台服务长期进行某项任务,那么使用 startService 便可以了。
如果你还想要与正在运行的 Service 进行交互,那么有两种方法:

  • 一种是使用 broadcast (如果交流较为频繁,容易造成性能上的问题)
  • 另一种是使用 bindService (需要 startService 和 bindService 一起使用了)
Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2023-2025 Annie
  • Visitors: | Views:

嘿嘿 请我吃小蛋糕吧~

支付宝
微信