该博客来自网络——————>>
稍微翻译理一理,这里主要是说IntentServic
不知道大家有没有和我一样,以前做项目或者练习的时候一直都是用Service来处理后台耗时操作,却很少注意到还有个IntentService,前段时间准备面试的时候看到了一篇关于IntentService的解释,发现了它相对于Service来说有很多更加方便之处,今天在这里稍微来总结下我的心得。
首先IntentService是继承自Service的,那我们先看看Service的官方介绍,这里列出两点比较重要的地方:
1.A Service is not a separate process. The Service object itself does not imply it is running in its own process; unless otherwise specified, it runs in the same process as the application it is part of.
2.A Service is not a thread. It is not a means itself to do work off of the main thread (to avoid Application Not Responding errors).
稍微翻一下(英文水平一般)
1.Service不是一个单独的进程 ,它和应用程序在同一个进程中。
2.Service不是一个线程,所以我们应该避免在Service里面进行耗时的操作
关于第二点我想说下,不知道很多网上的文章都把耗时的操作直接放在Service的onStart方法中,而且没有强调这样会出现Application Not Responding!希望我的文章能帮大家认清这个误区(Service不是一个线程,不能直接处理耗时的操作)。
有人肯定会问,那么为什么我不直接用Thread而要用Service呢?关于这个,大家可以网上搜搜,这里不过多解释。有一点需要强调,如果有耗时操作在Service里,就必须开启一个单独的线程来处理!!!这点一定要铭记在心。
IntentService相对于Service来说,有几个非常有用的优点,首先我们看看官方文档的说明:
IntentService is a base class for Services that handle asynchronous requests (expressed as Intents) on demand. Clients send requests throughstartService(Intent) calls; the service is started as needed, handles each Intent in turn using a worker thread, and stops itself when it runs out of work.
This "work queue processor" pattern is commonly used to offload tasks from an application's main thread. The IntentService class exists to simplify this pattern and take care of the mechanics. To use it, extend IntentService and implement onHandleIntent(Intent). IntentService will receive the Intents, launch a worker thread, and stop the service as appropriate.
All requests are handled on a single worker thread -- they may take as long as necessary (and will not block the application's main loop), but only one request will be processed at a time.
e使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。下面给一个小例子:
1.Service:
-
package com.zhf.service;
-
-
import Android.app.Service;
-
import Android.content.Intent;
-
import Android.os.IBinder;
-
-
public class MyService extends Service {
-
- @Override
- public void onCreate() {
- super.onCreate();
- }
-
- @Override
- public void onStart(Intent intent, int startId) {
- super.onStart(intent, startId);
- //经测试,Service里面是不能进行耗时的操作的,必须要手动开启一个工作线程来处理耗时操作
- System.out.println("onStart");
- try {
- Thread.sleep(20000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("睡眠结束");
- }
-
- @Override
- public IBinder onBind(Intent intent) {
- return null;
- }
- }
|
2.IntentService:
-
package com.zhf.service;
-
-
import Android.app.IntentService;
-
import Android.content.Intent;
-
-
public class MyIntentService extends IntentService {
-
- public MyIntentService() {
- super("yyyyyyyyyyy");
- }
-
- @Override
- protected void onHandleIntent(Intent intent) {
- // 经测试,IntentService里面是可以进行耗时的操作的
- //IntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent
- //对于异步的startService请求,IntentService会处理完成一个之后再处理第二个
- System.out.println("onStart");
- try {
- Thread.sleep(20000);
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- System.out.println("睡眠结束");
- }
- }
|
测试主程序:
-
package com.zhf.service;
-
-
import Android.app.Activity;
-
import Android.content.Intent;
-
import Android.os.Bundle;
-
-
public class ServiceDemoActivity extends Activity {
- /** Called when the activity is first created. */
- @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));
- }
- }
|
相关推荐
service中1需要手动开启子线程2服务开启之后会一直运行,需要手动调用stopService();或者stopSelf(); intentService是一种异步(子线程)、自动停止的服务,这个例子测试IntentService的特征
介绍service和intentservice的使用和其中应该注意的部分
主要介绍了Android系统中Service和IntentService的区别,与普通的服务相比,IntentService可以开启单独的线程来处理intent请求,需要的朋友可以参考下
3. 在ServiceDemoActivity.java中都调用了两个service,调用service自行屏蔽调用IntentServiceServie,调用IntentServiceServie自行屏蔽调用service。 4. 仅仅是个例子,对比这个service和IntentServiceServie的区别...
NULL 博文链接:https://zhanglimijavaeye.iteye.com/blog/1881599
Android中的IntentService是继承自Service类的,在我们讨论IntentService之前,我们先想一下Service的特点: Service的回调方法(onCreate、onStartCommand、onBind、onDestroy)都是运行在主线程中的。当我们通过start...
1)Service默认运行在主线程中,IntentService运行在一个新的线程中 2)Service需要主动调用stopSelf()或stopService()服务才可以停止,IntentService运行完后自动停止 使用IntentService需要注意2点: 1)构造函数中...
Service不会专门启动一条单独的进程,Service与它所在应用位于同一个进程中; Service也不是专门一条新线程,因此不应该在Service中直接处理耗时的任务; 二、IntentService特征 会创建独立的worker线程来...
IntentService基本使用方法Demo
IntentService简单demo,对应博文 http://blog.csdn.net/tianmi1988/article/details/50520339
Android 中IntentService的简单应用
对于有写工作,我们需要在后台进行,这里主要介绍了使用IntentService轻松实现模拟上传图片的例子。对于IntentServixce和Service扩展类的使用区别,大家可以自行去了解研究一下。
主要介绍了Android中使用IntentService创建后台服务实例,IntentService提供了在单个后台线程运行操作的简单结构,需要的朋友可以参考下
Android四大组件——Service后台服务、前台服务、IntentService、跨进程服务、无障碍服务、系统服务
Android说明Service生命周期的代码例子。用于演示Service组件从创建到销毁的完整生命周期,以及IntentService的使用例子。
本篇文章主要介绍了Android 基于IntentService的文件下载的示例代码,具有一定的参考价值,有兴趣的可以了解一下
Android_Blog_Demos 存储CSDN博客的一些源码...Android IntentService完全解析 当Service遇到Handler 详细 Android 高清加载巨图方案 拒绝压缩图片 ViewDragHelper实战 自己打造Drawerlayout Android UI性能优化实