zoukankan      html  css  js  c++  java
  • 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依然是存在的,仅仅是连接断开了。

  • 相关阅读:
    电商系统服务拆分实战
    打通电商多模式支持的“任督二脉”
    win10 home安装docker快速攻略
    如何深入理解一套MQ消息中间件
    自带win10的笔记本电脑如何装win7
    《大数据日知录:架构与算法》读书笔记(多图)
    一个典型的后台软件系统的设计复盘——(三)打通任督二脉-context
    一个典型的后台软件系统的设计复盘——(二)如何id一个事物
    dubbox源码分析(一)-服务的启动与初始化
    svn老鸟转用git必须理解的概念
  • 原文地址:https://www.cnblogs.com/slyfox/p/9375768.html
Copyright © 2011-2022 走看看