android service的作用_android threadlocal

android service的作用_android threadlocalAndroid-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依然是存在的,仅仅是连接断开了。

转载于:https://www.cnblogs.com/slyfox/p/9375768.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/107396.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • rabbitmq集群搭建_mongodb集群搭建

    rabbitmq集群搭建_mongodb集群搭建先来介绍一下RabbitMQ集群RabbitMQ集群有两种模式,一种是普通模式,即默认的集群模式,另外一种为镜像模式,可以把队列做成镜像队列我们在学习两种模式之前,先来了解下一些关于RabbitMQ集群的概念元数据:包括队列元数据,交换器元数据,交换器元数据,vhost元数据(1)队列元数据:队列名称和它的属性;(2)交换器元数据:交换器名称、类型和属性;(3)绑定元数据:一张简…

  • 微信小程序商城项目实战(第七篇:生成订单支付页)

    微信小程序商城项目实战(第七篇:生成订单支付页)订单支付分析代码实现效果图展示分析顶部改为”支付”上方为地址,跳转至地址管理,可修改下方为订单信息最下方显示所需支付金额以及支付按钮,点击支付则支付成功跳转订单页如果不支付则可以在我的订单内容查看该订单并且继续支付代码实现改变顶部导航内容”navigationBarTitleText”:”支付”界面:<navigatorurl=”/pages/addressList/addressList”class=”user_info_row”wx:if=”{{statu!=’待发

  • 使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)

    使用vmware vconverter从物理机迁移系统到虚拟机P2V(多图)zhuan:https://segmentfault.com/a/1190000002697929本文完整记录了如何从物理服务器,保持所有环境配置信息,纹丝不动的迁移到虚拟机上,俗称P2V。采用

  • 空格的正则表达式

    空格的正则表达式在正则表达式想使用空格的时候不能采用\s的方法,因为\s指的是空白,就是所有空白。如果想表示单纯的空格的话可以采用:[]方括号本身就是匹配其中的字符,那么其中放空格就是匹配空格;如果有其他正则表达式问题可以查看:https://blog.csdn.net/cao849861802/article/details/102505834…

  • Android物联网应用程序开发(智慧园区)—— 登录界面开发

    Android物联网应用程序开发(智慧园区)—— 登录界面开发效果:布局代码:<?xmlversion=”1.0″encoding=”utf-8″?><LinearLayoutxmlns:android=”http://schemas.android.com/apk/res/android”android:layout_width=”match_parent”android:layout_height=”match_parent”android:background=”@drawable/bg_ou

  • 华为的JAVA面试题及答案(部分)

    华为的JAVA面试题及答案(部分)

    2021年11月17日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号