Kotlin Service服务组件开发详解
作者:Hdnw
这几天分析了一下的启动过程,于是乎,今天写一下Service使用; 给我的感觉是它并不复杂,千万不要被一坨一坨的代码吓住了,虽然弯弯绕绕不少,重载函数一个接着一个,就向走迷宫一样,但只要抓住主线阅读,很快就能找到出口
服务简介
服务是Android中的四大组件之一,它能够长期在后台运行且不提供用户界面。即使用户切到另一应用程序,服务仍可以在后台运行。
服务的创建
(1)创建Service子类
class MyService : Service() { override fun onBind(intent: Intent): IBinder { TODO("Return the communication channel to the service.") } }
(2)在清单文件中配置
<service android:name=".MyService" android:enabled="true" android:exported="true"> </service>
服务的启动方式
(1)通过startService()方法启动
当通过startService()方法启动服务时,需要自身调用stopSelf()方法或者其他组件调用stopService()方法时服务才能停止。
(2)通过bindService()方法启动
当使用bingService()方法启动服务时,需要调用unbindService()方法解除绑定之后就会被销毁。
(3)即调用startService()方法,又调用了bingService()方法
这种情况下,要同时调用stopService()和unbindService()方法。
Service的生命周期
- onCreate():第一次创建服务时执行的方法。
- onDestory():服务被销毁时执行的方法。
- onStartCommand():访问者通过startService(intent)启动,服务时执行的方法。
- onBind():使用bindService()方式启动服务调用的方法。
- onUnbind():解除绑定时调用的方法。
Activity和Service进行通信
Activity和Service之间的通信由IBinder负责,在Activity中,创建一个类实现ServiceConnection接口,并且在这个类中重写onServiceConnected方法(当Service被绑定时会回调这个方法)和onServiceDisconnected方法(Service的创建进程崩溃或者被杀掉才会调用),然后再绑定Service。
class MainActivity : AppCompatActivity() { lateinit var myBinder:MyService.mBinder private val connection=object :ServiceConnection{ override fun onServiceConnected(p0: ComponentName?, p1: IBinder?) { myBinder=p1 as MyService.mBinder myBinder.a() } override fun onServiceDisconnected(p0: ComponentName?) { } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val bindbutton:Button=findViewById(R.id.bindbutton) val unbindbutton:Button=findViewById(R.id.unbindbutton) bindbutton.setOnClickListener { val intent=Intent(this,MyService::class.java) bindService(intent,connection,Context.BIND_AUTO_CREATE)//绑定Service } unbindbutton.setOnClickListener { unbindService(connection)//解绑Service } } }
在Service中,需要创建一个类继承Binder,在onBind()方法中返回这个类的实例。
class MyService : Service() { private val myBinder=mBinder() class mBinder:Binder(){ fun a(){ Log.d("data","service") } } override fun onBind(intent: Intent): IBinder { return myBinder } override fun onCreate() { super.onCreate() Log.d("data","onCreate") } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { Log.d("data","onStartCommand") return super.onStartCommand(intent, flags, startId) } override fun onDestroy() { super.onDestroy() Log.d("data","onDestroy") } }
实现前台Service
前台服务执行一些用户能注意到的操作。
代码如下:
需要先进行权限声明
<uses-permission android:name="android.permission.FOREGROUND_SERVICE"/>
class MyService : Service() { private val myBinder=mBinder() class mBinder:Binder(){ fun a(){ Log.d("data","service") } } override fun onBind(intent: Intent): IBinder { return myBinder } override fun onCreate() { super.onCreate() Log.d("data","onCreate") val manager=getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){ val channel=NotificationChannel("my_service","前台Service通知",NotificationManager.IMPORTANCE_DEFAULT) manager.createNotificationChannel(channel) } val intent=Intent(this,MainActivity::class.java) val pi=PendingIntent.getActivity(this,0,intent,0) val notification=NotificationCompat.Builder(this,"my_service") .setContentTitle("这是主题") .setContentText("这是内容") .setSmallIcon(R.drawable.ic_baseline_favorite_border_24) .build() startForeground(1,notification) } override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int { Log.d("data","onStartCommand") return super.onStartCommand(intent, flags, startId) } override fun onDestroy() { super.onDestroy() Log.d("data","onDestroy") } }
到此这篇关于Kotlin Service服务组件开发详解的文章就介绍到这了,更多相关Kotlin Service内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!