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,这位老哥把活干完向主线程报告了以后还会自杀,简直是根本不要操心


目录
相关文章
|
2月前
|
Java 开发者
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
Java面试题:请解释内存泄漏的原因,并说明如何使用Thread类和ExecutorService实现多线程编程,请解释CountDownLatch和CyclicBarrier在并发编程中的用途和区别
33 0
|
1月前
|
Go 调度 开发者
[go 面试] 深入理解进程、线程和协程的概念及区别
[go 面试] 深入理解进程、线程和协程的概念及区别
【多线程面试题十】、说一说notify()、notifyAll()的区别
notify()唤醒单个等待对象锁的线程,而notifyAll()唤醒所有等待该对象锁的线程,使它们进入就绪队列竞争锁。
|
18天前
|
消息中间件 资源调度 调度
进程与线程的区别
【8月更文挑战第24天】
19 0
|
20天前
|
消息中间件 安全 Java
Java 中的线程与进程之区别
【8月更文挑战第22天】
65 0
|
22天前
|
算法 Java
【多线程面试题十八】、说一说Java中乐观锁和悲观锁的区别
这篇文章讨论了Java中的乐观锁和悲观锁的区别,其中悲观锁假设最坏情况并在访问数据时上锁,如通过`synchronized`或`Lock`接口实现;而乐观锁则在更新数据时检查是否被其他线程修改,适用于多读场景,并常通过CAS操作实现,如Java并发包`java.util.concurrent`中的类。
|
22天前
|
Java
【多线程面试题十三】、说一说synchronized与Lock的区别
这篇文章讨论了Java中`synchronized`和`Lock`接口在多线程编程中的区别,包括它们在实现、使用、锁的释放、超时设置、锁状态查询以及锁的属性等方面的不同点。
【多线程面试题九】、说一说sleep()和wait()的区别
sleep()和wait()的主要区别在于sleep()是Thread类的静态方法,可以在任何地方使用且不会释放锁;而wait()是Object类的方法,只能在同步方法或同步代码块中使用,并会释放锁直到相应线程通过notify()/notifyAll()重新获取锁。
【多线程面试题 三】、 run()和start()有什么区别?
run()方法定义线程执行的任务,而start()方法启动线程,使得run()在新的线程中异步执行;直接调用run()方法只会同步执行run()中的代码,不会创建新线程。
|
2月前
|
消息中间件 安全 数据处理
Python中的并发编程:理解多线程与多进程的区别与应用
在Python编程中,理解并发编程是提高程序性能和响应速度的关键。本文将深入探讨多线程和多进程的区别、适用场景及实际应用,帮助开发者更好地利用Python进行并发编程。