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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 在vb中什么被称为对象_vb控件数组怎么创建

    在vb中什么被称为对象_vb控件数组怎么创建在BCB中使用VCL控件数组(一)抱雪昨晚和网友邬彦华在OICQ上闲聊,他言及正在为朋友编一个游戏菜单,其中动态创建了一组按纽,最后却无法释放。他的实现方法如下:for(inti=1;i<=ButtonCount;i++){TSpeedButton*spdBtn=newTSpeedButton(this);spdBtn->Parent=ScrollBox;//指定父…

    2025年11月24日
    2
  • asp.net中英文转换

    asp.net中英文转换一、中英文切换主要是依靠资源文件(Resources):资源文件名称格式:"页面名称加后缀.resx"      资源文件分为本地[App_LocalResources]和全球化[App_GlobalResources]二、实现过程:  本地资源:1.添加文件夹[App_LocalResources]                    2.创建以.resx结尾的资源文件   …

    2025年8月7日
    2
  • Linux用netstat查看服务及监听端口详解

    Linux用netstat查看服务及监听端口详解在Linux使用过程中,需要了解当前系统开放了哪些端口,并且要查看开放这些端口的具体进程和用户,可以通过netstat命令进行简单查询netstat命令各个参数说明如下:-a或–all显示所有连线中的Socket。-A<网络类型>或–…

    2022年7月23日
    9
  • matlab 三维数据多项式拟合,matlab多项式拟合

    matlab 三维数据多项式拟合,matlab多项式拟合在命令窗口下输入 x y cftool 在 CurveFitting 界面中 单击 Data 选择 xData 和 yData 选择 Createdatase 选择 Close 在 CurveFitting 界面中 单击 Fitting 选择 Newfit 选择 Typeoffit 选择 Polynomial 选择 9thdegreepol 打勾 Centerandsca

    2025年11月12日
    2
  • vs2008sp1补丁怎么安装_win10系统怎么安装cad2005

    vs2008sp1补丁怎么安装_win10系统怎么安装cad2005我第一次安装这个补丁的时候就挂了,搞得VS2005和相关的一些程序都不能运行,后来在网上找到了一些解决方法,结合自己的实际体验,写了这篇教程。补丁相关资料:简体中文版补丁名称:VS80sp1-KB926604-X86-CHS.exe版本:50727.762知识库(KB)文章:KB928957发布日期:2006/12/14简体中文版补丁大小:430

    2022年9月28日
    2
  • 轻量级Java EE企业应用实战(第3版)——Struts 2+Spring 3+Hibernate整合开发

    轻量级Java EE企业应用实战(第3版)——Struts 2+Spring 3+Hibernate整合开发

    2021年8月10日
    66

发表回复

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

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