Service和线程的区别

简介: Service和线程都没有UI界面,都是运行于后台的服务程序,google为什么要为Android系统创建Service这个组件呢?今天我就把自己的理解分享给大家

Thread(线程):


程序最小的执行单元,是分配给CPU的基本单位,用来执行异步操作


Thread(线程)的生命周期:


新建(new Thread)

就绪(线程已经启动,等待CPU资源)

运行(run已经获得资源)

死亡(执行完成 或 被杀死)

阻塞(因为某种原因线程让出CPU资源,就会进入阻塞状态)

新建——>就绪——>运行——>死亡——>阻塞


注意:


线程一旦运行起来,就和Activity失去了联系


即使Activity被销毁了,线程依旧能执行下去


总结:


线程是无法控制的


Service(服务):


Service是在主线程中运行的,但它不是一个线程,不能做耗时操作,会报ANR异常


问题:


Service不能做耗时操作,就意味着无法替代Thread的功能,那Service有啥意义啊?


解答:


这就是IntentService和Service的区别了


IntentService是一个处理异步请求的类,继承Service的service类

IntentService的内部有一个工作线程来处理耗时的操作

IntentService特有方法onHandleIntent,以队列方式执行工作线程

IntentService的源码如下:


public abstract class IntentService extends Service {

   private volatile Looper mServiceLooper;

   private volatile ServiceHandler mServiceHandler;

   private String mName;

   private boolean mRedelivery;

   private final class ServiceHandler extends Handler {

       public ServiceHandler(Looper looper) {

           super(looper);

       }

       @Override

       public void handleMessage(Message msg) {

           onHandleIntent((Intent)msg.obj);

           stopSelf(msg.arg1);    //执行完耗时操作后,Service就被销毁掉了

       }

   }

   public IntentService(String name) {

       super();

       mName = name;

   }

   public void setIntentRedelivery(boolean enabled) {

       mRedelivery = enabled;

   }

   @Override

   public void onCreate() {

     

       super.onCreate();

       HandlerThread thread = new HandlerThread("IntentService[" + mName + "]");

       thread.start();

       mServiceLooper = thread.getLooper();

       //创建一个Handler,这个时候Looper已经运行起来了,在HandlerThread的run方法中

       mServiceHandler = new ServiceHandler(mServiceLooper);

   }

   @Override

   public void onStart(@Nullable Intent intent, int startId) {

       Message msg = mServiceHandler.obtainMessage();

       msg.arg1 = startId;

       msg.obj = intent;

       mServiceHandler.sendMessage(msg);

   }

 

   @Override

   public int onStartCommand(@Nullable Intent intent, int flags, int startId) {

       onStart(intent, startId);

       return mRedelivery ? START_REDELIVER_INTENT : START_NOT_STICKY;

   }

   @Override

   public void onDestroy() {

       mServiceLooper.quit();

   }

 

   @Override

   @Nullable

   public IBinder onBind(Intent intent) {

       return null;

   }

 

   @WorkerThread

   protected abstract void onHandleIntent(@Nullable Intent intent);

}


Handler,Looper都是Android消息机制中特有的类


thread.start()代表着线程开启,随后通过  mServiceLooper  =  thread.getLooper()获取Looper


mServiceHandler  =  new  ServiceHandler(mService)并将looper放到Handler的构造函数中


IntentService的本质是自动新建一个线程,并为之创建一个Looper(Android只有主线程自带Looper,其他线程不带Looper,必须自己创建)。并通过Looper向Handler传递消息,完成异步操作。

最后当Looper队列中的消息全部传达完之后,IntentService会自动销毁。


把异步操作扔给IntentService,这位老哥把活干完向主线程报告了以后还会自杀,简直是根本不要操心


目录
相关文章
|
4月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
56 0
|
3月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
|
1月前
|
Dubbo Java 应用服务中间件
剖析Tomcat线程池与JDK线程池的区别和联系!
剖析Tomcat线程池与JDK线程池的区别和联系!
105 0
剖析Tomcat线程池与JDK线程池的区别和联系!
|
30天前
|
缓存 算法 Java
Java 中线程和纤程Fiber的区别是什么?
【10月更文挑战第14天】
68 0
|
2月前
|
NoSQL 网络协议 Unix
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
1)Redis 属于单线程还是多线程?不同版本之间有什么区别?
67 1
【多线程面试题十】、说一说notify()、notifyAll()的区别
notify()唤醒单个等待对象锁的线程,而notifyAll()唤醒所有等待该对象锁的线程,使它们进入就绪队列竞争锁。
WK
|
2月前
|
并行计算 调度 Python
GIL和线程之间的区别是什么
全局解释器锁(GIL)与线程在Python中具有不同角色。GIL作为CPython中的互斥锁,确保同一时间只有一个线程执行Python字节码,简化内存管理但限制多线程并行性;线程则是程序执行的最小单位,允许多个任务并发运行。GIL影响整个解释器,使多线程串行化;线程则代表独立执行流,受GIL制约。GIL在计算密集型任务中成为瓶颈,但在I/O密集型任务中多线程仍可提升性能。理解两者差异有助于优化多线程应用。
WK
30 0
|
3月前
|
消息中间件 资源调度 调度
进程与线程的区别
【8月更文挑战第24天】
36 0
|
3月前
|
消息中间件 安全 Java
Java 中的线程与进程之区别
【8月更文挑战第22天】
92 0
|
3月前
|
算法 Java
【多线程面试题十八】、说一说Java中乐观锁和悲观锁的区别
这篇文章讨论了Java中的乐观锁和悲观锁的区别,其中悲观锁假设最坏情况并在访问数据时上锁,如通过`synchronized`或`Lock`接口实现;而乐观锁则在更新数据时检查是否被其他线程修改,适用于多读场景,并常通过CAS操作实现,如Java并发包`java.util.concurrent`中的类。

热门文章

最新文章