Service基础知识
Service(服务)是一个没有用户界面的在后台运行耗时操作的应用组件。其它应用组件能够启动Service,并且当用户切换到另外的应用场景时,Service将持续在后台运行。另外,一个组件能够绑定到Service与之交互(IPC)机制,例如,一个service可能会处理网络操作,播放音乐,操作文件I/O或者与内容提供者(content provider)交互,所有这些活动都是在后台进行。
注意:service与activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理诸如网络请求的耗时操作。如果在service里进行一些耗CPU和耗时操作,可能会引发ANR警告,这时应用会弹出是强制关闭还是等待的对话框。
Service的生命周期图:
context.startService() ->onCreate()- >onStart()->Service running--调用context.stopService() ->onDestroy()
context.bindService()->onCreate()->onBind()->Service running--调用>onUnbind() ->onDestroy()
启动和关闭Service:
第一种方法:
public void myService(){
Intent i = new Intent(MainActivity.this,MyService.class);
startService(i);// 启动Service
stopService(i);// 关闭Service
}
通过startService()启动的服务处于“启动的”状态,一旦启动,service就在后台运行,即使启动它的应用组件已经被销毁了。通常started状态的service执行单任务并且不返回任何结果给启动者。比如当下载或上传一个文件,当这项操作完成时,service应该停止它本身。
第二种方法:
public void myService() {
Intent i = new Intent(MainActivity.this, MyService.class);
// 绑定Service
bindService(i, MainActivity.this, Context.BIND_AUTO_CREATE);
// 取消绑定
unbindService(MainActivity.this);
}
如果想通过bindService()方法来启动Service,那么调用该方法的类要实现ServiceConnection接口并重写下面两个方法:
// 成功绑定时调用
@Override
public void onServiceConnected(ComponentName arg0, IBinder arg1) {
}
// 绑定的Service崩时触发
@Override
public void onServiceDisconnected(ComponentName arg0) {
}
并且在Service的onBind()方法中不能返回null,否则绑定失败。可以在onServiceConnected()中获取到被绑定的Service在onBind()方法中返回的IBinder实例对象,通过该实例对象就可以与该Service进行交互。
注意:
1、当Service被创建一次之后,只要它还在运行,那么下次调用 它时就不会再重新创建,也就是所运行的Service实例对象只有一个。
2、通过bindService()方法可以创建并绑定Service,通过unbindService()方法可以取消绑定并销毁该Service;但是如果通过startService()方法来创建一个Service,再通过bindService()方法来绑定它,那么当调用unbindService()方法时只会取消该Service的绑定,而不会销毁该Service,只有再调用stopService()方法才能销毁该Service。
public class MyService extends Service {
private final MyServiceBinder binder = new MyServiceBinder();
/**
* Service被绑定时候会调用该方法,如果该方法返回null, 那么就会绑定失败
*/
@Override
public IBinder onBind(Intent arg0) {
return binder;
}
public class MyServiceBinder extends Binder {
public MyService getService() {
return MyService.this;
}
}
@Override
public void onCreate() {
super.onCreate();
}
@Override
public void onDestroy() {
super.onDestroy();
}
}