Android-Service学习总结

1.startService()

startService(intent)  //启动service
stopService(intent)   //结束service
  • 主要是用来启动服务,后续Activity和Service不需要通信
  • 如果第一次启动,onCreate()会调用,再次点击,只会调用onStartCommand()。就是说Service和Activity是独立的,如果我在页面A调用startService,在页面B再startService,会发现页面B只会调用onStartCommand()方法
  • 可以在Service中自己stopSelf()

2.bindService()

bindService(intent,serviceConnection,flag)  //绑定service
unbindServide(serviceConnection)  //解绑
  • 当Activity需要和Service通信时,需要使用bindService(),在onBind()方法里返回binder,返回的binder可以通过三种方式:
    • 扩展Binder类,如果不需要多进程,使用这种方式
    • 使用Messager,这是包装过AIDL的简单实现
    • 使用AIDL
  • 在activity被销毁时,需要解绑,否则会报下面的错:
Activity has leaked ServiceConnection that was originally bound here
  • ServiceConnection的onServiceDisconnected()方法在服务端进程死掉时会被调用
  • flag一般使用Context.BIND_AUDO_CREATE表示建立关联后自动创建Service
  • onServiceConnected()和onServiceDisconnected()都运行在UI线程,所以不能在它们里面调用服务端耗时方法

3.startService()和bindService混合使用

  • 这两者是可以混合使用的,例如音乐播放器,使用startService()让音乐可以一直播放,就算activity被销毁也没关系,当重新打开Activity时,使用bindService重新绑定Service
  • 如果混合使用,在关闭service时,需要stopService()和unbindService()都调用才会销毁Service

4.Service和Thread的关系(可以看看郭神讲的)

  • 它俩没关系
  • Service是运行在主线程的,只是因为它可以脱离界面,所以一般用来后台使用,如果在Service里要做耗时操作,比如下载,还是要开新线程的

5.IntentService(可以看看鸿洋讲的)

使用IntentService,会新开一个工作线程处理任务,同时在Service全部处理完后自己关闭。我们只需要在onHandleIntent()中处理任务就好

class TestIntentService : IntentService("TestIntentService") {

    override fun onCreate() {
        super.onCreate()
        info("TestIntentService.onCreate()")
    }

    override fun onHandleIntent(intent: Intent?) {
        Thread.sleep(2000)
        if (intent != null) {
            info("下载完成,${intent.getIntExtra("num", 0)}")
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        info("TestIntentService.onDestroy()")
    }

}

运行结果:
Android-Service学习总结_第1张图片

你可能感兴趣的:(android学习)