Android中Service和IntentService的差别

前言:

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));
    }  
}  

猜你喜欢

转载自blog.csdn.net/margin_0px/article/details/83027482