Android 启动service(Kotlin)

一、使用startForegroundService()或startService()启用service

**Activity

 //启动service
val intent: Intent = Intent(ServiceActivity@this,MyService::class.java)
//Build.VERSION_CODES.O = 26
// Android8以后,不允许后台启动Service
if(Build.VERSION.SDK_INT >= 26){
    startForegroundService(intent)
 }else{
    startService(intent)
 }

**Service

package com.example.buju.service


import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat

class MyService:Service() {

    override fun onCreate() {
        super.onCreate()
        Log.e("MyService","onCreate")

        initNotification()
    }

     // 初始化通知(安卓8.0之后必须实现)
    private fun initNotification() {

        val channelName = "channelName"
        val channelId = "channelId"
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            // 发送通知,把service置于前台
            val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            // 从Android 8.0开始,需要注册通知通道
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH)
                notificationManager.createNotificationChannel(channel)
            }

            // 页面跳转
            val intent = Intent(applicationContext,ServiceActivity::class.java)
            val pendingIntent = PendingIntent.getActivity(this, 0, intent,
                PendingIntent.FLAG_UPDATE_CURRENT)

            // 创建通知并配置相应属性
            val notification = NotificationCompat.Builder(this, channelId)
                .setSmallIcon(android.R.drawable.star_off)//小图标一定需要设置,否则会报错(如果不设置它启动服务前台化不会报错,但是你会发现这个通知不会启动),如果是普通通知,不设置必然报错
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), android.R.drawable.star_on))
                .setContentTitle("通知标题")// 标题
                .setContentText("通知内容")// 内容
                .setPriority(NotificationCompat.PRIORITY_DEFAULT)
                .setContentIntent(pendingIntent)// 设置跳转
                .setWhen(System.currentTimeMillis())
                .setAutoCancel(false)
                .setOngoing(true)
                .build()
            // 注意第一个参数不能为0
            startForeground(1, notification)


        }
    }


    override fun onBind(intent: Intent?): IBinder? {
        Log.e("MyService","onBind")
        return null
    }


    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.e("MyService","onStartCommand")
        return super.onStartCommand(intent, flags, startId)

    }

    override fun onUnbind(intent: Intent?): Boolean {
        Log.e("MyService","onUnbind")
        return super.onUnbind(intent)
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.e("MyService","onDestroy")
        //停止的时候销毁前台服务。
        stopForeground(true);

    }

}

注意该方法不会调用onBind()和onUnbind()

二、绑定启用service

**Activity

package com.example.buju

import android.content.ComponentName
import android.content.Context
import android.content.Intent
import android.content.ServiceConnection
import android.os.Bundle
import android.os.IBinder
import android.util.Log
import android.view.View
import android.widget.Button
import androidx.appcompat.app.AppCompatActivity
import com.example.buju.service.MyService

class ServiceActivity:AppCompatActivity() {
    private var myBinder:MyService.MyBinder? = null
    lateinit var startBtn:Button
    lateinit var stopBtn:Button
    lateinit var getBtn:Button

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_service)

        initControls()

    }

    /**
     * 控件初始化
     * */
    private fun initControls(){

        startBtn = findViewById(R.id.startBtn)
        startBtn.setOnClickListener(btnClick)

        stopBtn = findViewById(R.id.stopBtn)
        stopBtn.setOnClickListener(btnClick)

        getBtn = findViewById(R.id.getBtn)
        getBtn.setOnClickListener(btnClick)

    }

    /**
     * service 连接
     * */
    private val connection = object:ServiceConnection{
        //Activity与Service连接成功时回调该方法
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            Log.e("MyService","---------Service 成功连接----------")
            myBinder = service as MyService.MyBinder
        }
        // Activity与Service断开连接时回调该方法
        override fun onServiceDisconnected(name: ComponentName?) {
            Log.e("MyService","---------Service 断开连接----------")
        }
    }

    /**
     * 点击事件
     * */
   val btnClick:(View)->Unit = {
       when(it.id) {
           R.id.startBtn -> {
               // 绑定service
               val intent: Intent = Intent(ServiceActivity@this,MyService::class.java)
               bindService(intent,connection,Context.BIND_AUTO_CREATE)


           }
           R.id.stopBtn ->{
               // 解除绑定
               unbindService(connection)
           }
           R.id.getBtn ->{
               // 获取service传递过来的数据
               Log.e("MyService","getCount=${myBinder?.getCount()}")
           }
           else ->{

           }

       }

   }



    override fun finish() {
        super.finish()
        overridePendingTransition(R.anim.slide_no,R.anim.slide_out_from_bottom)
    }

    override fun onDestroy() {
        super.onDestroy()

        // 解除绑定
        unbindService(connection)
    }

}

**Service

package com.example.buju.service


import android.app.NotificationChannel
import android.app.NotificationManager
import android.app.Service
import android.content.Context
import android.content.Intent
import android.graphics.BitmapFactory
import android.os.Binder
import android.os.Build
import android.os.IBinder
import android.util.Log
import androidx.core.app.NotificationCompat

class MyService:Service() {
    /**
     * 用于传递参数
     * */
    private var count:Int = 0

    private var myBinder:MyBinder = MyBinder()

    inner class MyBinder: Binder(){
        fun getCount():Int?{
            return count
        }
    }

    override fun onCreate() {
        super.onCreate()
        Log.e("MyService","onCreate")

        Thread(Runnable {
            Thread.sleep(1000)
            count=100
        }).start()

        initNotification()
    }

    // 初始化通知(安卓8.0之后必须实现)
    private fun initNotification() {
        val channelName = "channelName"
        val channelId = "channelId"
        if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.O){
            // 发送通知,把service置于前台
            val notificationManager = getSystemService(Context.NOTIFICATION_SERVICE) as NotificationManager
            // 从Android 8.0开始,需要注册通知通道
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                val channel = NotificationChannel(channelId, channelName, NotificationManager.IMPORTANCE_HIGH)
                notificationManager.createNotificationChannel(channel)
            }
            val notification = NotificationCompat.Builder(this, channelId)
                .setSmallIcon(android.R.drawable.star_off)//小图标一定需要设置,否则会报错(如果不设置它启动服务前台化不会报错,但是你会发现这个通知不会启动),如果是普通通知,不设置必然报错
                .setLargeIcon(BitmapFactory.decodeResource(getResources(), android.R.drawable.star_on))
                .setContentTitle("通知标题")// 标题
                .setContentText("通知内容")// 内容
                .setWhen(System.currentTimeMillis())
                .setAutoCancel(false)
                .setOngoing(true)
                .build()

            // 注意第一个参数不能为0
            startForeground(1, notification)

        }
    }



    override fun onBind(intent: Intent?): IBinder? {
        Log.e("MyService","onBind")
        return myBinder
    }


    override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
        Log.e("MyService","onStartCommand")
        return super.onStartCommand(intent, flags, startId)

    }

    override fun onUnbind(intent: Intent?): Boolean {
        Log.e("MyService","onUnbind")
        return super.onUnbind(intent)
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.e("MyService","onDestroy")
        //停止的时候销毁前台服务。
        stopForeground(true);

    }

}
相关推荐
小比卡丘1 小时前
C语言进阶版第17课—自定义类型:联合和枚举
android·java·c语言
前行的小黑炭2 小时前
一篇搞定Android 实现扫码支付:如何对接海外的第三方支付;项目中的真实经验分享;如何高效对接,高效开发
android
落落落sss4 小时前
MybatisPlus
android·java·开发语言·spring·tomcat·rabbitmq·mybatis
代码敲上天.4 小时前
数据库语句优化
android·数据库·adb
GEEKVIP6 小时前
手机使用技巧:8 个 Android 锁屏移除工具 [解锁 Android]
android·macos·ios·智能手机·电脑·手机·iphone
model20058 小时前
android + tflite 分类APP开发-2
android·分类·tflite
彭于晏6898 小时前
Android广播
android·java·开发语言
与衫9 小时前
掌握嵌套子查询:复杂 SQL 中 * 列的准确表列关系
android·javascript·sql
500了16 小时前
Kotlin基本知识
android·开发语言·kotlin
人工智能的苟富贵17 小时前
Android Debug Bridge(ADB)完全指南
android·adb