Service
简介:Service是程序后台运行,不需要用户交互,长期运行的任务,做耗时的操作。
注意
1、当使用startService()方式启动service时,service调用了onCreate 和 onStartCommand方法。
2、单独使用bindService(),unbindService()会经历:->onCreate()->onBind()->Service running->onUnbind() -> onDestroy() 。
单独使用startService(),stopService()会经历:->onCreate()->onStartCommand()->Service running-> onDestroy() 。
3、Activity需要不断的从Service中获取数据,可以通过bind回调机制获取到Service对象,就可以得到Service里面的数据和公开类。
所以,一般都是使用startService
代码
首先在manifests里面加入service
<service android:name=".MyService"/>
mainActivity:
class MainActivity : AppCompatActivity() {
var mServiceConnection: ServiceConnection? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//一、start方式启动service服务
val intent = Intent(this, MyService::class.java)
startService(intent)
//二、bind方式启动service服务(为以后使用MyService里面的函数和属性做准备)
mServiceConnection=object : ServiceConnection {
override fun onServiceConnected(name: ComponentName, service: IBinder) {
Log.d("WY+", "==MainActivity.bindService:==" + name.className)
service as MyService.MyBinder
service.baolu()//使用MyService里面的方法
}
override fun onServiceDisconnected(name: ComponentName) {
// TODO Auto-generated method stub
}
}
val intentBind = Intent(this, MyService::class.java)
// intentBind.action = "action1"
// intentBind.putExtra("myparam", 222)
//启动服务
bindService(intentBind,mServiceConnection , Service.BIND_AUTO_CREATE)
}
override fun onDestroy() {
super.onDestroy()
//停止service服务
stopService(intent)
unbindService(mServiceConnection)
}
MyService:
class MyService : Service() {
override fun onBind(intent: Intent): IBinder? {
Log.d("WY+", "=MyService.onBind=")
return MyBinder()
// throw UnsupportedOperationException("Not yet implemented")
}
override fun onCreate() {
super.onCreate()
Log.d("WY+", "=MyService.onCreate=")
}
override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
Log.d("WY+", "=MyService.onStartCommand=")
// 耗时的操作
/** 创建一个线程,每秒计数器加一,并在控制台进行Log输出(这里不想导入协程的包所以用线程) */
Thread(Runnable {
var count = 0
while (count < 1000) {
try {
Thread.sleep(2000)
} catch (e: InterruptedException) {
}
count++
Log.i("WY+", "Count is$count")
}
}).start()
return super.onStartCommand(intent, flags, startId)
}
override fun onDestroy() {
super.onDestroy()
Log.d("WY+", "=MyService.onDestroy=")
}
/**
* 服务中的Binder对象,实现自定义接口IMyBinder,决定暴露那些方法给绑定该服务的Activity
*/
internal inner class MyBinder : Binder() {
var aaa = "暴露给Activity的属性"
//暴露给activity调用的方法
fun baolu() {
Log.d("WY+", "===我是来自MyService暴露出来的方法")
}
}
}
什么情况下用service:上传、下载大文件,连网心跳包发送和接收
最后demo下载地址为:
https://download.csdn.net/download/wy313622821/12267430