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);

    }

}
相关推荐
踢球的打工仔11 小时前
PHP面向对象(7)
android·开发语言·php
安卓理事人11 小时前
安卓socket
android
安卓理事人16 小时前
安卓LinkedBlockingQueue消息队列
android
万能的小裴同学18 小时前
Android M3U8视频播放器
android·音视频
q***577418 小时前
MySql的慢查询(慢日志)
android·mysql·adb
JavaNoober19 小时前
Android 前台服务 "Bad Notification" 崩溃机制分析文档
android
城东米粉儿19 小时前
关于ObjectAnimator
android
zhangphil20 小时前
Android渲染线程Render Thread的RenderNode与DisplayList,引用Bitmap及Open GL纹理上传GPU
android
火柴就是我21 小时前
从头写一个自己的app
android·前端·flutter
lichong9511 天前
XLog debug 开启打印日志,release 关闭打印日志
android·java·前端