`
zha_zi
  • 浏览: 584745 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

Service和Thread的关系

阅读更多

 

Service和Thread的关系

不少Android初学者都可能会有这样的疑惑,Service和Thread到底有什么关系呢?什么时候应该用Service,什么时候又应该用Thread?答案可能会有点让你吃惊,因为Service和Thread之间没有任何关系!

之所以有不少人会把它们联系起来,主要就是因为Service的后台概念。Thread我们大家都知道,是用于开启一个子线程,在这里去执行一些耗时操作就不会阻塞主线程的运行。而Service我们最初理解的时候,总会觉得它是用来处理一些后台任务的,一些比较耗时的操作也可以放在这里运行,这就会让人产生混淆了。但是,如果我告诉你Service其实是运行在主线程里的,你还会觉得它和Thread有什么关系吗?让我们看一下这个残酷的事实吧。

在MainActivity的onCreate()方法里加入一行打印当前线程id的语句:

Log.d("MyService", "MainActivity thread id is " + Thread.currentThread().getId()); 

 然后在MyService的onCreate()方法里也加入一行打印当前线程id的语句:

Log.d("MyService", "MyService thread id is " + Thread.currentThread().getId());  

 现在重新运行一下程序,并点击Start Service按钮,会看到如下打印日志:

     

可以看到,它们的线程id完全是一样的,由此证实了Service确实是运行在主线程里的,也就是说如果你在Service里编写了非常耗时的代码,程序必定会出现ANR的。

你可能会惊呼,这不是坑爹么!?那我要Service又有何用呢?其实大家不要把后台和子线程联系在一起就行了,这是两个完全不同的概念。Android的后台就是指,它的运行是完全不依赖UI的。即使Activity被销毁,或者程序被关闭,只要进程还在,Service就可以继续运行。比如说一些应用程序,始终需要与服务器之间始终保持着心跳连接,就可以使用Service来实现。你可能又会问,前面不是刚刚验证过Service是运行在主线程里的么?在这里一直执行着心跳连接,难道就不会阻塞主线程的运行吗?当然会,但是我们可以在Service中再创建一个子线程,然后在这里去处理耗时逻辑就没问题了。

额,既然在Service里也要创建一个子线程,那为什么不直接在Activity里创建呢?这是因为Activity很难对Thread进行控制,当Activity被销毁之后,就没有任何其它的办法可以再重新获取到之前创建的子线程的实例。而且在一个Activity中创建的子线程,另一个Activity无法对其进行操作。但是Service就不同了,所有的Activity都可以与Service进行关联,然后可以很方便地操作其中的方法,即使Activity被销毁了,之后只要重新与Service建立关联,就又能够获取到原有的Service中Binder的实例。因此,使用Service来处理后台任务,Activity就可以放心地finish,完全不需要担心无法对后台任务进行控制的情况。

一个比较标准的Service就可以写成:

@Override  
public int onStartCommand(Intent intent, int flags, int startId) {  
    new Thread(new Runnable() {  
        @Override  
        public void run() {  
            // 开始执行后台任务  
        }  
    }).start();  
    return super.onStartCommand(intent, flags, startId);  
}  
  
class MyBinder extends Binder {  
  
    public void startDownload() {  
        new Thread(new Runnable() {  
            @Override  
            public void run() {  
                // 执行具体的下载任务  
            }  
        }).start();  
    }  
  
}  

 

 

分享到:
评论

相关推荐

    深入剖析Android中Service和Thread区别

    接下来就为大家解释以下Service和Thread的区别。 首先要说明的是,进程是系统最小资源分配单位,而线程是则是最小的执行单位,线程需要的资源通过它所在的进程获取。 Service与Thread的区别: Thread:Thread 是程序...

    JMeterPlugin 部分说明

    JMeterPluging生成的很多图都很Thread有关系,因此在使用non gui模式时一定要在jmeter.properties中修改下来参数 jmeter.save.saveservice.thread_counts=true 在linux下使用non gui模式的命令是: ./jmeter.sh -n -...

    rock.tsf.jar

    StateLess:无状态连接,即连接虽然没有结束,但下一次调用和这一次之间没有关系。调用线程实例的getSocket( )方法,得到socket连接对象,把它加入到无状态socket连接队列中。同时把处于休眠状态的线程实例放到...

    《深入理解Android》卷Ⅰ

    6.2.5 秋风扫落叶-StartThread Pool和join Thread Pool分析 6.2.6 你彻底明白了吗 6.3 服务总管ServiceManager 6.3.1 ServiceManager的原理 6.3.2 服务的注册 6.3.3 ServiceManager存在的意义 6.4 ...

    G-Sensor工作流程

    G-Sensor工作流程,主要是讲上下层接口的关系,SensorService主要功能如下: 1) SensorService::instantiate创建实例对象,并增加到ServiceManager中,且创建并启动线程,并执行threadLoop 2) threadLoop从sensor...

    深入理解Android:卷I--详细书签版

    本章拓展思考部分讨论了与Binder有关的三个问题,它们分别是Binder和线程的关系、死亡通知以及匿名Service。笔者 希望,通过本章的学习,大家能更深入地认识Binder的本质。  第7章阐述了Audio系统中的三位重要...

    教你理解微信小程序的生命周期和运行原理

    小程序由两大线程组成:负责界面的线程(view thread)和服务线程(appservice thread),各司其职由互相配合 小程序的生命周期借鉴了Android的生命周期,如果你了解过Android的APP开发,那么理解小程序的就会很简单...

    Android开发艺术探索

    4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2 layout过程 / 193 4.3.3 draw过程 / 197 4.4 自定义View / 199 4.4.1 自定义View的分类 ...

    深入理解Android卷1全

    6.2.5 秋风扫落叶-StartThread Pool和join Thread Pool分析 / 149 6.2.6 你彻底明白了吗 / 152 6.3 服务总管ServiceManager / 152 6.3.1 ServiceManager的原理 / 152 6.3.2 服务的注册 / 155 6.3.3 ServiceManager...

    android开发艺术探索高清完整版PDF

    177 4.2.1 Measure Spec / 177 4.2.2 Measure Spec和Layout Params的对应关系 / 178 4.3 View的工作流程 / 183 4.3.1 measure过程 / 183 4.3.2 layout过程 / 193 4.3.3 draw过程 / 197 4.4 自定义View / 199 ...

    基于某JAVA地剪刀石头布游戏设计——Java课程设计报告材料-.doc

    游戏程序框图如图1所示: 图1 游戏程序框图 2.4 JAVA类与自定义类相互继承的层次关系 2.4.1 Java类与自定义类的说明 自定义类: 类名:SocketServer 作用:服务器类 继承的父类:Thread类 实现的接口:无 类名:Service ...

    超级有影响力霸气的Java面试题大全文档

    sleep是线程类(Thread)的方法,导致此线程暂停执行指定时间,给执行机会给其他线程,但是监控状态依然保持,到时后会自动恢复。调用sleep不会释放对象锁。 wait是Object类的方法,对此对象调用wait方法导致本线程...

    JAVA的剪刀石头布游戏设计方案.doc

    游戏程序框图如图1所示: 图1 游戏程序框图 2.4 JAVA类及自定义类相互继承的层次关系 2.4.1 Java类及自定义类的说明 自定义类: 类名:SocketServer 作用:服务器类 继承的父类:Thread类 实现的接口:无 类名:Service ...

    Nucleus OS源码结构以及参考手册

    系统服务映射关系 Service Call Mapping 目标环境依赖 Environment Dependencies 版本控制 Version Control 第四章.组件描述 通用服务组件(CS) 通用服务组件文件 通用服务控制块 通用服务函数 初始化组件 (IN ...

    Java测试题1答案

    《Java测试题1》 Java培训后考试 一、 是非题5...(5) 23、说说JSP、servlet的生命周期以及二者之间的对应关系(8) <br>24、如何使用JDBC访问数据库,编程的步骤是什么、给出相应的案例代码?(8) <br>

    java 面试题 总结

    引用类型和原始类型具有不同的特征和用法,它们包括:大小和速度问题,这种类型以哪种类型的数据结构存储,当引用类型和原始类型用作某个类的实例数据时所指定的缺省值。对象引用实例变量的缺省值为 null,而原始...

    java面试题

    答:多线程有两种实现方法,一种是继承Thread类或者实现Runnable接口。同步就是在方法返回类型后面加上synchronized。 c#中的委托,事件是不是委托? 答:委托就是将方法作为一个参数带入另一个方法叫做委托,事件...

    汪文君高并发编程实战视频资源全集

    │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战.mp4 │ 高并发编程第一阶段18讲、数据同步的引入与Synchronized的简单介绍.mp4 │ 高并发编程第一阶段19讲、结合...

    汪文君高并发编程实战视频资源下载.txt

    │ 高并发编程第一阶段17讲、Thread API综合实战,编写ThreadService实现暴力结束线程的综合实战.mp4 │ 高并发编程第一阶段18讲、数据同步的引入与Synchronized的简单介绍.mp4 │ 高并发编程第一阶段19讲、结合...

Global site tag (gtag.js) - Google Analytics