• Android-Service和Thread


    Android-Service和Thread

    学习自

    郭霖的博客

    服务是运行在主线程上的

    可能在我们第一次接触到Service的时候都是对于 __服务是运行在主线程上的 __这一现象不太理解,但是事实上确实是如此。尽管Service是运行与后台的这个特性比较让我们误解。但是请不要将Service的后台和Thread弄混了,这两个没有任何的关系。Service的目的是,做一些持续性的操作,即使当所有的Activity都退出了,但是Service也不会被结束。Service 也是我们开发的APP程序的一部分,只不过Activity负责门面而Service负责在幕后工作,比如说发送心跳包,播放音乐等。

    关于服务是运行在主线程上的我们可以通过打印Thread的ID来证明

    //在Activity的onCreate方法中获取线程的ID
    "Activity: Current thread id is ${Thread.currentThread().id}".logE() 
    //输出结果:Current thread id is 2
    //在Service的onCreate方法中获取线程的ID
    "Service: Current thread id is ${Thread.currentThread().id}".logE()
    //输出结果:Service: Current thread id is 2
    

    在服务中开启线程

    因为Service是运行在主线程上的所以,当我们在Service执行一些操作的时候,我们往往需要开启线程来帮助我们完成。一个比较标准的服务可以写成下面这样:

    class TestService : Service() {
        private val mTestBinder = TestBinder()
    
        /**
         * 返回Binder
         * */
        override fun onBind(intent: Intent?): IBinder {
            return mTestBinder
        }
    
        //在这里完成一些初始化操作
        override fun onCreate() {
            super.onCreate()
        }
    
        override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
            thread {
                //do some thing
            }
            return super.onStartCommand(intent, flags, startId)
        }
    
        //在这里回收资源
        override fun onDestroy() {
            super.onDestroy()
        }
    
        inner class TestBinder : Binder() {
            fun startDownload() {
                thread {
                    //do some thing
                }
            }
        }
    }
    

    或许你比较疑惑,既然使用了Service还得开启线程,那么为什么还要使用Service呢,直接在Activity中开启线程不就结了。原因是: 在Activity中的线程没有很好的可操作性,比如在Activity创建的时候开启了线程,如果Activity关闭了的话,那么我们再也没有办法拿到在关闭的Activity中开启的线程的实例了,这显然是很容易造成不可预料的后果的。而在Service则不一样,Service在任意的一个Activity中都可以随意的访问,如果通过了混合方式开启了Service的话,即使一个Activity解除了Bind,Service依然是存在的,仅仅是连接断开了。

  • 相关阅读:
    csrf
    cookies和session区别
    关于Processing开发应用及发布分享的一些经验分享
    C++调用动态链接库DLL的隐式链接和显式链接基本方法小结
    C++最基本调用静态库的方法小结
    C++最基本调用动态链接库dll方法的小结
    基于Potplayer类播放器或Action!类录屏软件调取摄像头方式的定时抓拍保存图像方法小结
    基于Openframeworks调取摄像头方式的定时抓拍保存图像方法小结
    DOS使用技巧整理 [典型案例分享]
    正则表达式使用技巧整理
  • 原文地址:https://www.cnblogs.com/slyfox/p/9375768.html
Copyright © 2020-2023  润新知