四大组件之一:Service

Service

简介:Service是程序后台运行,不需要用户交互,长期运行的任务,做耗时的操作。

注意

1、当使用startService()方式启动service时,service调用了onCreate 和 onStartCommand方法。

2、单独使用bindService(),unbindService()会经历:->onCreate()->onBind()->Service running->onUnbind() -> onDestroy() 。

单独使用startService(),stopService()会经历:->onCreate()->onStartCommand()->Service running-> onDestroy() 。

3、Activity需要不断的从Service中获取数据,可以通过bind回调机制获取到Service对象,就可以得到Service里面的数据和公开类。
所以,一般都是使用startService

代码

首先在manifests里面加入service

<service android:name=".MyService"/>

mainActivity:

class MainActivity : AppCompatActivity() {
    var mServiceConnection: ServiceConnection? = null

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

        //一、start方式启动service服务
        val intent = Intent(this, MyService::class.java)
        startService(intent)

        //二、bind方式启动service服务(为以后使用MyService里面的函数和属性做准备)
        mServiceConnection=object : ServiceConnection {
            override fun onServiceConnected(name: ComponentName, service: IBinder) {
                Log.d("WY+", "==MainActivity.bindService:==" + name.className)
                service as MyService.MyBinder
                service.baolu()//使用MyService里面的方法
            }

            override fun onServiceDisconnected(name: ComponentName) {
                // TODO Auto-generated method stub

            }
        }
        val intentBind = Intent(this, MyService::class.java)
//        intentBind.action = "action1"
//        intentBind.putExtra("myparam", 222)
        //启动服务
        bindService(intentBind,mServiceConnection , Service.BIND_AUTO_CREATE)


    }

    override fun onDestroy() {
        super.onDestroy()
        //停止service服务
        stopService(intent)
        unbindService(mServiceConnection)
    }

MyService:

class MyService : Service() {

    override fun onBind(intent: Intent): IBinder? {
        Log.d("WY+", "=MyService.onBind=")

        return MyBinder()
//        throw UnsupportedOperationException("Not yet implemented")

    }

    override fun onCreate() {
        super.onCreate()
        Log.d("WY+", "=MyService.onCreate=")

    }

    override fun onStartCommand(intent: Intent, flags: Int, startId: Int): Int {
        Log.d("WY+", "=MyService.onStartCommand=")
        //        耗时的操作
        /** 创建一个线程,每秒计数器加一,并在控制台进行Log输出(这里不想导入协程的包所以用线程) */
        Thread(Runnable {
            var count = 0
            while (count < 1000) {
                try {
                    Thread.sleep(2000)
                } catch (e: InterruptedException) {

                }
                count++
                Log.i("WY+", "Count is$count")
            }
        }).start()

        return super.onStartCommand(intent, flags, startId)
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("WY+", "=MyService.onDestroy=")
    }


    /**
     * 服务中的Binder对象,实现自定义接口IMyBinder,决定暴露那些方法给绑定该服务的Activity
     */
    internal inner class MyBinder : Binder() {
        var aaa = "暴露给Activity的属性"

        //暴露给activity调用的方法
        fun baolu() {
            Log.d("WY+", "===我是来自MyService暴露出来的方法")
        }

    }


}

什么情况下用service:上传、下载大文件,连网心跳包发送和接收
最后demo下载地址为:
https://download.csdn.net/download/wy313622821/12267430

发布了26 篇原创文章 · 获赞 24 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/wy313622821/article/details/105073699
今日推荐