当前位置:   article > 正文

kotlin中的service_kotlin service

kotlin service

定义一个service

新建一个ServiceTest项目,右键包名新建Service,将类名定义为MyService。

接下来我们尝试启动和停止Service。修改activity_main.xml:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <Button
  6. android:id="@+id/startServiceBtn"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="Start Service" />
  10. <Button
  11. android:id="@+id/stopServiceBtn"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:text="Stop Service" />
  15. </LinearLayout>

修改MainActivity:

  1. class MainActivity : AppCompatActivity(), View.OnClickListener {
  2. override fun onCreate(savedInstanceState: Bundle?) {
  3. super.onCreate(savedInstanceState)
  4. setContentView(R.layout.activity_main)
  5. val resList = listOf<View>(startServiceBtn, stopServiceBtn)
  6. for (res in resList) {
  7. res.setOnClickListener(this)
  8. }
  9. }
  10. override fun onClick(v: View?) {
  11. when (v?.id) {
  12. R.id.startServiceBtn -> {
  13. //使用intent启动服务
  14. startService(Intent(this, MyService::class.java))
  15. }
  16. R.id.stopServiceBtn -> {
  17. //使用intent停止服务
  18. stopService(Intent(this, MyService::class.java))
  19. }
  20. }
  21. }
  22. }

ActivityService进行通信

虽然Service是在Activity里启动的,但是在启动了Service之后,Activity与Service基本就没有什么关系了。启动之后service会一直处于运行状态,但运行的是什么逻辑,activity就控制不了了。

此时我们可以借助onBind方法,使得两者之间联系更加紧密。比如说,目前我们希望在MyService里提供一个下载功能,然后在Activity中可以决定何时开始下载,以及随时查看下载进度。

修改MyService:

  1. class MyService : Service() {
  2. //创建DownloadBinder的实例
  3. private val mBinder = DownloadBinder()
  4. //创建类继承Binder,在内部实现开始下载和获取进度的方法
  5. class DownloadBinder : Binder() {
  6. fun startDownload() {
  7. Log.d("MyService", "startDownload executed")
  8. }
  9. fun getProgress(): Int {
  10. Log.d("MyService", "getProgress executed")
  11. return 0
  12. }
  13. }
  14. //service创建时调用
  15. override fun onCreate() {
  16. super.onCreate()
  17. }
  18. //service每次启动时调用
  19. //如果希望service一启动就执行某个方法,将方法放到这里
  20. override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
  21. return super.onStartCommand(intent, flags, startId)
  22. }
  23. override fun onDestroy() {
  24. super.onDestroy()
  25. }
  26. override fun onBind(intent: Intent?): IBinder? {
  27. //如果禁止绑定,在此处return null
  28. //我们在此处返回了自定义binder的实例,里面包含了我们提供给activity调用的方法
  29. return mBinder
  30. }
  31. }

修改完成之后,我们看看要如何在activity中调用service中的这些方法。首先修改布局文件:

  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:orientation="vertical">
  5. <Button
  6. android:id="@+id/startServiceBtn"
  7. android:layout_width="match_parent"
  8. android:layout_height="wrap_content"
  9. android:text="Start Service" />
  10. <Button
  11. android:id="@+id/stopServiceBtn"
  12. android:layout_width="match_parent"
  13. android:layout_height="wrap_content"
  14. android:text="Stop Service" />
  15. <Button
  16. android:id="@+id/bindServiceBtn"
  17. android:layout_width="match_parent"
  18. android:layout_height="wrap_content"
  19. android:text="Bind Service" />
  20. <Button
  21. android:id="@+id/unbindServiceBtn"
  22. android:layout_width="match_parent"
  23. android:layout_height="wrap_content"
  24. android:text="Unbind Service" />
  25. </LinearLayout>

新增了两个分别用于绑定和取消service的按钮,而与service绑定的,自然是activity,绑定之后就可以使用Binder中的方法了。修改MainActivity:

  1. class MainActivity : AppCompatActivity(), View.OnClickListener {
  2. lateinit var downloadBinder: MyService.DownloadBinder
  3. private val connection = object : ServiceConnection {
  4. //进程崩溃或被杀掉时才会调用,不常用
  5. override fun onServiceDisconnected(name: ComponentName?) {
  6. TODO("Not yet implemented")
  7. }
  8. //当activity与service创建连接时,会调用该方法
  9. override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
  10. //向下转型,获得DownloadBinder的实例,进而调用里面的方法
  11. downloadBinder = service as MyService.DownloadBinder
  12. downloadBinder.startDownload()
  13. downloadBinder.getProgress()
  14. }
  15. }
  16. override fun onCreate(savedInstanceState: Bundle?) {
  17. super.onCreate(savedInstanceState)
  18. setContentView(R.layout.activity_main)
  19. val resList = listOf<View>(startServiceBtn, stopServiceBtn, bindServiceBtn, unbindServiceBtn)
  20. for (res in resList) {
  21. res.setOnClickListener(this)
  22. }
  23. }
  24. override fun onClick(v: View?) {
  25. when (v?.id) {
  26. R.id.startServiceBtn -> {
  27. startService(Intent(this, MyService::class.java))
  28. }
  29. R.id.stopServiceBtn -> {
  30. stopService(Intent(this, MyService::class.java))
  31. }
  32. R.id.bindServiceBtn -> {
  33. bindService(Intent(this, MyService::class.java), connection, Context.BIND_AUTO_CREATE)
  34. }
  35. R.id.unbindServiceBtn -> {
  36. unbindService(connection)
  37. }
  38. }
  39. }
  40. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/黑客灵魂/article/detail/1009237
推荐阅读
相关标签
  

闽ICP备14008679号