Service详解
1.Service是什么
2.service的应用场景,以及和Thread区别
3.开启Service的两种方式以及区别
1.Service是什么?
四大组件之一,执行某些需要长时间需要执行,程序退出时任能在后台存在
Service(服务)是一个一种可以在后台执行长时间操作而没有用户界面的应用组件
Service和广播BroadcastRecever 共同点:运行在主进程,都不能做长时间的耗时操作
2.Service的应用场景,以及和Thread区别
1.定义:Thread程序执行的最小单元,执行一些异步操作
service是android的机制,本地service,thread运行相对独立,service依托于所在进程
service和thread是什么关系,有什么区别,什么时候用service,什么时候用thread
service和thread没有关系。服务和后台的概念不能混淆,service运行在主线程
android的后台(service)指的是运行完全不依赖于UI线程, 及时Activity被销毁,回收,Service仍然可以运行
service不能做耗时操作,耗时操作需要创建thread
Activity很难对thread进行控制,特别是Activity被销毁后,无法控制
总结:定义上,thread是程序执行的最小单元,是分配cpu的基本单位。service是android的一种机制,是进程托管,是一种轻量级的ipc,Activity和service绑定,数据通信,也可以在不同的进程中,通信可用ipc
ANR异常,无法响应
2.实际开发中:service运行在主线程
3.应用场景:使用网络,文件查询,使用工作线程即开启子线程处理
不需要界面长时间执行的常见,播放音乐,天气预报的统计,数据统计等等
3.开启Service的两种方式以及区别
onBind():**bindService方式执行**
onCreate():首次创建服务时,系统将调用此方法执行一次新设置程序(在调用onStartCommand() 或onBind()之前)
如果服务已经在运行,则不会调用次方法,该方法只会被调用一次
图1
onStartCommand(): 每次通过startService()方法启动service时都会被回调
返回值:int类型
源码中:
public int onStartCommand(Intent intent,int flgas,int startId){
onStart(intent,startId);
return mStartComptibility?START_STICK_COMPATIBLITY:START_STICKY;
}
START_STICKY:当整个service因为系统内存不足被整个杀掉后,一段时间系统空闲时,系统会尝试重新创建这个Service,service将重新启动,但其中的intent将是为空。
这个值适合循环播放播放,音乐播放器,天气预报这类服务
onDestroy():服务销毁时的回调:
可以在这里做回收工作,清理释放资源。1.线程,2.注册的监听器 3.ContentProvider
unBind():服务解除绑定时的回调
1.startService方式启动
步骤:1.定义一个类继承Service
2.在Manifest.xml文件中配置该Service
3.使用Context的startService(Intent)方法启动该Service
4.不再使用时,调用stopService(intent)方法停止该服务
生命周期:1.onCreate->onStartCommand
再次启动 onStartCommand
停止:->onDestory()
2.bindService:bind绑定方式提供了客户端和服务端的接口
相当于Activity和Service交互的接口,允许二者数据交互,发送请求,获取结果等等,甚至Activity和Service在不同进程中时,可以进行进程中通信来传输数据,这需要在Service被绑定到Activity之后才运行
同时,多个Activity可以绑定一个Service,但是绑定全部取消后Service就会自动销毁,他并不一定需要向startService方式一样,需要显示stopService才会销毁
**步骤:**
1.创建BinderService服务端,继承自Service,并在类中创建一个实现了IBinder接口的实例对象,该对象提供了公共方法给客户端调用
2.从onBinder()回调方法中返回次Binder实例对象。
3.在客户端中,从onServiceConntected()方法中回调方法接收Binder,并使用提供的方法调用绑定服务。
举例:
public class BindService extends Service{
private final static String TAG = "BindService";
private int count;//客户端会需要
private boolean quit;
private Thread thread;
private LocalBinder binder = new LocalBinder();
//创建Binder对象,返回给客户端即Activity使用,提供数据交互的接口
public class LocalBinder entends Binder{
//声明一个方法,getService(提供给客户端使用)
BinderService getService(){
//返回当前对象的LocalService,这样我们就可以在客户端调用Service的公共方法了
return BindService.this;
}
}
//把Binder类返回给客户端
public IBinder onBind(Intent intent){
return binder;
}
public void onCreate(){
super.onCreate();
log.i(TAG,"Service is invoke Created");
thread = new Thread(new Runnable(){
public void run(){
//每隔一秒count加1,直到quit为true
while(!quit){
thread.sleep(1000)
count ++;
}
}
})
}
//公共方法
public int getCount(return count;)
//解除绑定时调用
public boolean onUnbind(Intent intent){
return super.onUnbind(intent);
}
public void onDestroy(){
this.quit = true;
super.onDestroy();
}
}
Activity中:
conn = new ServiceConnection({
//与服务端交互的接口方法,绑定服务的时候被回调,在这个方法获取绑定Service传递过来的IBinder对象,通过这个IBinder对象,实现宿主和Service的交互
public void onServiceConnected(ComponentName name,IBinder ibinder){
BindService.LocalBinder binder = (BindService.LocalBinder)ibinder;
mService = binder.getService();
}
//当取消绑定的时候被回调,但正常情况下是不被调用的,它的调用时机是当Service服务被意外销毁时,例如内存的资源不足时这个方法才被自动调用
public void onServiceDisconnected(ComponentName name){
mService = null;
}
}
bindService(intent,conn,Service.BIND_AUTO_CREATE);
生命周期:bindService后:
1.onCreate->onBind
再次绑定->不会走onBind,但如果是bind新的ServiceConnection会走onBind方法
解除完绑定会走onUnBind和onDestroy方法
当start和bind都使用时,只有当stop和unbind解除完后Service才会被销毁
网友评论