Android中Service和IntentService
转载请标明出处:http://blog.csdn.net/donkor_/article/details/78875391
前言:
ServiceTimeout(20 seconds)小概率类型Service在特定的时间内无法处理完成,会造成ANR — 应用程序无响应(ANR:Application Not Responding)的情况
▲ 分析 :
避免ANR最核心的一点就是在主线程减少耗时操作。这时我们建议使用intentService处理。intentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题
▲ 区别 :
1. 首先IntentService是继承自Service;
2. Service不是一个单独的进程,它和应用程序在同一个进程中;
3. Service也不是一个线程,所以我们要避免在Service中进行耗时的操作;
4. IntentService使用队列的方式将请求的Intent加入队列,然后开启了一个Worker Thread(工作线程)在处理队列中的Intent,对于异步的startService请求,
IntentService会处理完成一个之后在处理第二个,每一个请求都会在一个单独的Worker Thread中处理,不会阻塞应用程序的主线程。
因此,如果我们如果要在Service里面处理一个耗时的操作,我们可以用IntentService来代替使用。
5. 使用IntentService 必须首先继承IntentService并实现onHandleIntent()方法,将耗时的任务放在这个方法执行,其他方面,IntentService和Service一样。
▲ 例子 :
Service_demo
public class MyService extends Service { @Override public void onCreate() { super.onCreate(); } @Override public void onStart(Intent intent, int startId) { super.onStart(intent, startId); //经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作 Log.e("MyService","onStart"); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("MyService","睡眠结束"); } @Override public IBinder onBind(Intent intent) { return null; } }
IntentService_demo
public class MyIntentService extends IntentService { public MyIntentService() { super("donkor"); } @Override protected void onHandleIntent(Intent intent) { // 经测试,IntentService里面是可以进行耗时的操作的 //IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent //对于异步的startService请求,IntentService会处理完成一个之后再处理第二个 Log.e("MyIntentService","onStart"); try { Thread.sleep(20000); } catch (InterruptedException e) { e.printStackTrace(); } Log.e("MyIntentService","睡眠结束"); } }
TextServiceActivity
public class TextServiceActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); startService(new Intent(this,MyService.class));//主界面阻塞,最终会出现Application not responding //连续两次启动IntentService,会发现应用程序不会阻塞,而且最重的是第二次的请求会再第一个请求结束之后运行(这个证实了IntentService采用单独的线程每次只从队列中拿出一个请求进行处理) startService(new Intent(this,MyIntentService.class)); startService(new Intent(this,MyIntentService.class)); } }
About me
Email :donkor@yeah.net
Android开发交流QQ群 : 537891203
更多相关文章
- Android多线程——线程池ThreadPoolExecutor详解及使用
- Android(安卓)实现微信登录详解
- android中get方式和post方式提交数据到服务器的区别
- 网络连接和概述
- chromium-cronet库的编译用于Android和ios平台实现quic协议
- android网络请求框架Volley(二)
- android P系统访问http请求最简单解决方案
- Android(安卓)Camera2 之 CameraCaptureSession 详解
- Android9.0 默认是禁止所有的http java.io.IOException: Clear