欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Kotlin Service服務(wù)組件開發(fā)詳解

 更新時(shí)間:2022年12月02日 09:38:51   作者:Hdnw  
這幾天分析了一下的啟動(dòng)過(guò)程,于是乎,今天寫一下Service使用; 給我的感覺(jué)是它并不復(fù)雜,千萬(wàn)不要被一坨一坨的代碼嚇住了,雖然彎彎繞繞不少,重載函數(shù)一個(gè)接著一個(gè),就向走迷宮一樣,但只要抓住主線閱讀,很快就能找到出口

服務(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)文章

最新評(píng)論