一、Service 是什么
1、大家随口就能答得上来,Service是一个在后台执行长时间运行操作而不用提供用户界面的应用组件,可由其他组件启动,即使用户切换到其他应用程序,Service 仍然在后台继续运行。
2、service的弊端:
service既不是独立的进程也不是独立的线程,是依赖于主线程的,所以是不建议在service里面做过多的耗时操作的,避免ANR。
3、Service 有两种启动方式,并且它的两种启动方式的生命周期是不一样的。
A)startService方式,注意参数
从Android官方文档中,我们知道onStartCommand有4种返回值:
1、START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会
尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
2、START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
那个直到接收新的intent对象,这个服务才会被重新创建。这是最安全的选项,用来避免在不需要的时候运行你的服务。
3、START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,
系统会自动重启该服务,并将Intent的值传入。
4、START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
B)bindService 方式,多个组件可以绑定到同一个服务上,绑定服务的时候,需要提供一个ServiceConnection 接口,在接口回调中获取Binder 对象,与服务进行通信。
二、IntentService是什么
1、IntentService是继承Service处理异步请求的一个类,拥有service的全部生命周期,包含了service的全部特性;
2、它有一个工作线程来处理耗时操作,启动IntentService的方式和启动传统的Service一样
3、同时,当任务执行完后,IntentService会自动停止,而不需要我们手动去控制或stopSelf()。
4、可以启动IntentService多次,这就会产生多个job,而每一个耗时操作会以工作队列的方式在IntentService的onHandleIntent回调方法中执行,并且,每次只会执行一个工作线程,执行完第一个再执行第二个,即one-by-one方式。
三、IntentService能做什么
1、举个例子,文件下载
@Override
protected void onHandleIntent(Intent intent) {
HttpURLConnection conn = null;
InputStream is = null;
String blogUrl = intent.getStringExtra("url");
String blogName = intent.getStringExtra("name");
try {
//下载指定的文件
URL url = new URL(blogUrl);
conn = (HttpURLConnection) url.openConnection();
if (conn != null) {
//我们在此处得到所下载文章的输入流,可以将其以文件的形式写入到存储卡上面或
//将其读取出文本显示在App中
is = conn.getInputStream();
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (conn != null) {
conn.disconnect();
}
}
}
2、Application里初始化三方控件等