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

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

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

赞 (0)
全栈程序员-站长的头像全栈程序员-站长

相关推荐

  • ListView中实现部分刷新的两种方法

    ListView中实现部分刷新的两种方法ListView在开发中用到的地方非常多,我们经常是全部刷新来更新数据,如果只需要更新某一条数据,该怎么实现呢?我在项目中使用过以下两种方法:1.通过点击的位置,获取需要刷新那一列对应的控件,然后在控

    2022年7月2日
  • VUE分页出现省略号「建议收藏」

    VUE分页出现省略号「建议收藏」提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档VUE分页出现省略号废话不多说直接上代码calcPageNum(){letpageTotal=Math.ceil(this.total/this.limit);//获取最大页码数letcur=this.currentPage;//获取当前页码数if(pageTotal<7){//判断什么时候正常显示

    2022年10月1日
  • unity3d场景制作

    unity3d场景制作这是最后的成果以上图片资源均为资源商店免费获取制作地形的方法1创建相邻地形(主要用于地形的扩大)2绘制地形(主要用于地貌的设置)3绘制树(用于树木的绘制)4绘制细节(用于小草或小花的设置)5地形设置(用于整体设置)绘制的主要方面为2、3、4点第2点:不同地形是有不同纹理形成,在编辑地形层中选择自己喜欢的地形。注意:法线贴图是地形纹理的进一步深化,可以加强地形的真实感第3点绘制树与绘制地形基本相同第4点绘制细节与前两者不同的是,除了细节纹理外,还有细节网格对与地形的

    2022年4月30日
  • printwriter写入文件_java socket编程

    printwriter写入文件_java socket编程2015-02-2006:30:01阅读(1843)下面示例代码演示使用PrintWriter方法写文件。PrintWriter的构造函数接受FileWriter作为参数。得到PrintWriter实例之后调用其println()方法即可写入字符串。importjava.io.FileWriter;importjava.io.IOException;importjava.io.Prin…

    2022年8月10日
  • c++入门教程–-6循环语句

    c++入门教程–-6循环语句

    2021年3月12日
  • linux下安装node&npm

    linux下安装node&npm#下载最新版nodewgethttps://nodejs.org/dist/v16.14.0/node-v16.14.0-linux-x64.tar.xz#解压tar-xvfnode-v16.14.0-linux-x64.tar.xz#配置软连接,使全局都可以使用node命令sudoln-s/opt/node-v16.14.0-linux-x64/bin/node/usr/bin/nodesudoln-s/opt/node-v16.14.0-linux-x64/bin/

    2022年8月30日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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