Kotlin Service服務(wù)組件開發(fā)詳解
服務(wù)簡(jiǎn)介
服務(wù)是Android中的四大組件之一,它能夠長(zhǎng)期在后臺(tái)運(yùn)行且不提供用戶界面。即使用戶切到另一應(yīng)用程序,服務(wù)仍可以在后臺(tái)運(yùn)行。
服務(wù)的創(chuàng)建
(1)創(chuàng)建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>
服務(wù)的啟動(dòng)方式
(1)通過(guò)startService()方法啟動(dòng)
當(dāng)通過(guò)startService()方法啟動(dòng)服務(wù)時(shí),需要自身調(diào)用stopSelf()方法或者其他組件調(diào)用stopService()方法時(shí)服務(wù)才能停止。
(2)通過(guò)bindService()方法啟動(dòng)
當(dāng)使用bingService()方法啟動(dòng)服務(wù)時(shí),需要調(diào)用unbindService()方法解除綁定之后就會(huì)被銷毀。
(3)即調(diào)用startService()方法,又調(diào)用了bingService()方法
這種情況下,要同時(shí)調(diào)用stopService()和unbindService()方法。
Service的生命周期
- onCreate():第一次創(chuàng)建服務(wù)時(shí)執(zhí)行的方法。
- onDestory():服務(wù)被銷毀時(shí)執(zhí)行的方法。
- onStartCommand():訪問(wèn)者通過(guò)startService(intent)啟動(dòng),服務(wù)時(shí)執(zhí)行的方法。
- onBind():使用bindService()方式啟動(dòng)服務(wù)調(diào)用的方法。
- onUnbind():解除綁定時(shí)調(diào)用的方法。
Activity和Service進(jìn)行通信
Activity和Service之間的通信由IBinder負(fù)責(zé),在Activity中,創(chuàng)建一個(gè)類實(shí)現(xiàn)ServiceConnection接口,并且在這個(gè)類中重寫onServiceConnected方法(當(dāng)Service被綁定時(shí)會(huì)回調(diào)這個(gè)方法)和onServiceDisconnected方法(Service的創(chuàng)建進(jìn)程崩潰或者被殺掉才會(huì)調(diào)用),然后再綁定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中,需要?jiǎng)?chuàng)建一個(gè)類繼承Binder,在onBind()方法中返回這個(gè)類的實(shí)例。
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") } }
實(shí)現(xiàn)前臺(tái)Service
前臺(tái)服務(wù)執(zhí)行一些用戶能注意到的操作。
代碼如下:
需要先進(jìn)行權(quán)限聲明
<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","前臺(tái)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("這是內(nèi)容") .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") } }
到此這篇關(guān)于Kotlin Service服務(wù)組件開發(fā)詳解的文章就介紹到這了,更多相關(guān)Kotlin Service內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解Flutter WebView與JS互相調(diào)用簡(jiǎn)易指南
這篇文章主要介紹了詳解Flutter WebView與JS互相調(diào)用簡(jiǎn)易指南,分為JS調(diào)用Flutter和Flutter調(diào)用JS,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2019-04-04Android自定義流式布局實(shí)現(xiàn)淘寶搜索記錄
這篇文章主要為大家詳細(xì)介紹了Android自定義流式布局實(shí)現(xiàn)淘寶搜索記錄,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-10-10關(guān)于androidstuio導(dǎo)入系統(tǒng)源碼的問(wèn)題
小編最近在做系統(tǒng)源碼導(dǎo)出來(lái)的小項(xiàng)目,在導(dǎo)入androidstudio過(guò)程中遇到過(guò)一些問(wèn)題,本文以Schedule power on off為例給大家詳細(xì)介紹,需要的朋友參考下吧2021-06-06Android自定義View仿大眾點(diǎn)評(píng)星星評(píng)分控件
這篇文章主要為大家詳細(xì)介紹了Android自定義View仿大眾點(diǎn)評(píng)星星評(píng)分控件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-03-03Android中ListView下拉刷新的實(shí)現(xiàn)代碼
這篇文章主要介紹了Android中ListView下拉刷新的實(shí)現(xiàn)代碼的相關(guān)資料,需要的朋友可以參考下2017-06-06Android用RecyclerView實(shí)現(xiàn)動(dòng)態(tài)添加本地圖片
本篇文章主要介紹了Android用RecyclerView實(shí)現(xiàn)動(dòng)態(tài)添加本地圖片,具有一定的參考價(jià)值,有興趣的可以了解一下2017-08-08Android編程單選項(xiàng)框RadioGroup綜合應(yīng)用示例
這篇文章主要介紹了Android編程單選項(xiàng)框RadioGroup用法,結(jié)合實(shí)例形式分析了Android單選按鈕組RadioGroup的定義與具體使用技巧,需要的朋友可以參考下2016-10-10解決Android Studio 格式化 Format代碼快捷鍵問(wèn)題
這篇文章主要介紹了解決Android Studio 格式化 Format代碼快捷鍵問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03Android自定義View實(shí)現(xiàn)投票進(jìn)度條
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)投票進(jìn)度條,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-11-11