IntentService基本法

类注释翻译

IntentService是Android提供用来处理异步请求的服务类,继承自Service。可以通过使用startService(Intent)来发送请求至IntentService,它将在它维护的一个工作线程中,按顺序执行收到的任务请求,在所有任务完成后自行结束。

这种使用工作线程的模式一般用来缓解主线程的压力,IntentService就是用来简化使用该模式的一种产物。

使用方式是:创建类继承IntentService,实现onHandleIntent(Intent),它将会接收客户端使用startService(Intent)发来的Intent,启动一个工作线程,然后在适当的时候结束自己。

所有发来的任务都将在同一个工作线程中被执行,且只能同时执行一个。在一个任务执行时,其它任务将排队等候,执行将不会阻塞app的主线程。

角色

作为Android提供给开发者用来执行异步任务的一种简单方便的Service的封装,类似于AsyncTask。

用法

  • 创建类继承IntentService。

  • 实现onHandleIntent(Intent)方法,其参数Intent就是调用startService(Intent)时开启此IntentService时的参数Intent,执行任务所需的参数应保存在Intent中。在此方法实现中需要描述如何使用Intent中传递来的参数执行任务。

  • 可以多次调用startService(Intent)提交任务,任务将依次在工作线程中执行。

实现原理

  • 当IntentService被创建时,它会创建一个HandlerThread(HandlerThread是Android提供的已经准备好Looper的消息循环线程),并调用thread.start()启动线程,还会创建一个绑定了该消息循环线程(即工作线程)的Handler。

  • 客户通过调用startService(Intent)启动IntentService,参数以Intent中的Extra形式携带传递。在onstart()状态回调时会创建一个消息,将此Intent和一个标记这次请求的id,通过上述Handler从主线程发送给工作线程。

  • Handler的handleMessage(Message)回调方法接收到上一步的消息,调用我们在创建IntentService时必须重写的onHandleIntent(Intent)方法,按照我们预设的处理方法,对接收到的消息进行处理(一般是一个如下载之类的延时任务)。

  • 在执行当前任务时,如果又有客户通过startService(Intent)请求执行一个任务,新的任务将会加入工作线程的消息队列中,等待当前任务执行完毕。IntentService只维护一个工作线程,所有接到的任务将一个一个排队在工作线程中执行。

  • 执行完一个任务后,IntentService会自动调用stopSelf(int)尝试停止并销毁自身。如果此时仍有任务在消息队列中排队的话,IntentService将不会被销毁,而是转而执行下一个任务;如果此时消息队列中已经没有消息时,IntentService将结束,回调onDestroy()

  • IntentService结束后,如果再有客户尝试请求执行一个新任务,它将会被重新创建,再次回调onCreate()

为什么不建议通过bindService来启动IntentService?

IntentService设计为不支持以bindService()的方式启动,它本身就是通过工作线程执行异步任务,无法保证生命周期与绑定的Activity同步。源码中的onBind()默认没有返回用于绑定的Binder对象,而是直接返回null。

你可能感兴趣的:(IntentService基本法)