这个系列博客 是讲解Service相关的知识
1,什么是service?
Service是一个可以在后台执行长时间操作而不使用用户界面的应用组件。它一般运行在主线程中.如果需要在service里面做一些耗时的任务,一般开启子线程来完成.
Service继承ContextWapper-->Context
2.Service 以及其子类IntentService的区别.
Service 默认运行在ui线程中(可以处理比较复杂的问题.多线程请求问题).
IntentService 有一下特点:
- 默认的工作线程,用于在应用的主线程外 执行传递给 onStartCommand() 的所有 Intent
- 创建工作队列,用于将一个 Intent 逐一传递给 onHandleIntent() 实现
- 在处理完所有启动请求后停止服务 不用自己调用stopSelf()
public class IntentServiceDemo extends IntentService {
public IntentServiceDemo(String name) {
super(name);
}
@Override
protected void onHandleIntent(Intent intent) {
//在这里根据intent进行操作
}
}
如果你有让service同时处理多个请求的需求,这个时候就只能去继承Service了。这个时候就要自己去处理工作线程那些事.
public class HelloService extends Service {
private Looper mServiceLooper;
private ServiceHandler mServiceHandler;
private final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {
super(looper);
}
@Override
public void handleMessage(Message msg) {
long endTime = System.currentTimeMillis() + 5*1000;
while (System.currentTimeMillis() < endTime) {
synchronized (this) {
try {
wait(endTime - System.currentTimeMillis());
} catch (Exception e) {
}
}
}
stopSelf(msg.arg1);
}
}
@Override
public void onCreate() {
HandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);
thread.start();
mServiceLooper = thread.getLooper();
mServiceHandler = new ServiceHandler(mServiceLooper);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "service starting", Toast.LENGTH_SHORT).show();
Message msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
mServiceHandler.sendMessage(msg);
return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
}
}
Service的创建,直接继承Service 复写里面的方法.
onCreate()
在service的生命周期中这个方法仅会调用一次,调用在onStartCommand()以及onBind()之前,可以在这个方法中进行一些一次性的初始化工作。
onStartCommend() 在其他组件调用startService()的时候调用.
onBind(). 其他组件通过bindService(,,,)来绑定时候调用.该方法要求返回一个IBinder对象.它是用来其他组件和Service进行通讯的桥梁.
onDestory(). 如果是通过bind 绑定的service,在销毁前,要先调用unbindService()方法.
启动service的方式 | 停止service的方式 | service与启动它的组件之间的通信方式 (广播组件不能直接和Service通讯) | service的生命周期 | |
---|---|---|---|---|
startServie | service中调用stopSelf()方法,或者其他组件调用stopService()方法 | 没有提供默认的通信方式,启动service后该service就处于独立运行状态 | 一旦启动,service即可在后台无限期运行,即使启动service的组件已被销毁也不受其影响,直到其被停止 | |
bindService | 调用unbindService()方法 | 可以通过 ServiceConnection进行通信,组件可以与service进行交互、发送请求、获取结果.还可以利用IPC跨进程执行这些操作 | 当所有与其绑定的组件都取消绑定(可能是组件被销毁也有可能是其调用了unbindService()方法)后,service将停止 |