Season 5 ep 7,IntentService之禅。
见山是山,见水是水;见山不是山,见水不是水;见山仍是山,见水仍是水。
Video Link
Work With An Intent
在Android系统中我们经常会用Intent来传递消息,如果一个Intent需要花很长时间来处理,在上过了前面几节课之后,你一定已经掌握了如何应对这种task的办法——在新的Worker Thread
中解决这个任务。
基于Season 5前面几节所讲的知识,你可能会选用AsyncTask或者HandlerThread来完成这个工作,然而,这两个并非最好的选择,因为:
- AsyncTask通常处理UI交互方面的事情,当你的Activity正处于后台(没有任何UI元素在渲染中)时,AsyncTask并不能完成它的任务
- HandlerThread倒是可以脱离UI运行,不过因为它是一个独立的Thread,当没有Intent过来时,这个Thread仍然会维持它的生命活动,意味着,空闲时占用资源。(一条Thread会占用65k+的内存)
IntentService
这是就要隆重推出IntentService了。IntentService更像是Service与HandlerThread的合体(a hybrid between Service class and HandlerThread),它继承自Service,在运行时会创建HandlerThread,来处理接收到的Intent请求。
因为IntentService本质上是一个Service,你可以通过它进行一些Service既有的功能,如使用alarm做定时/循环操作。
Be Careful With IntentService
在享受IntentService所带来便利的时候,也有一些注意事项。
首先,IntentService所有任务是在同一个队列中按顺序处理的,同AsyncTask一样,如果排在前面的一个任务极其耗时,会使得后面任务迟迟得不到执行,这是就要考虑HandlerThread等其他解决方案了。
其次,IntentService使用类似Broadcast Receiver的机制将任务执行结果返回给Activity,这在运行结果的正确性上并没有任何问题。然而对于简单的结果返回操作,是不需要使用如此重量级的Broadcast Receiver来进行的。你可以改用runOnUIThread
来降低资源消耗。
Other Benifits of IntentService
使用IntentService还有一个附加的好处——它会使你的app在被切换到后台时,不那么容易被杀死。(相比于那些在后台运行且没有Service的app而言)