Service(服务)是安卓中的四大组件之一,它通常用作在后台处理耗时的逻辑,与Activity一样,它存在自己的生命周期,也需要在AndroidManifest.xml配置相关信息。
Service通常位于后台运行,是一个专门在后台处理长时间任务的Android组件,它没有UI。
它有两种启动方式,startService和bindService。
只是启动Service,启动它的组件(如Activity)和Service并没有关联,只有当Service调用stopSelf或者其他组件调用stopService服务才会终止。
当第一次调用的时候,方法顺序是:
构造方法——oncreate()——onStartCommand()
当第二次被调用的时候,直接调用onStartCommand()
结束:stopService():——>onDestory()
调用bindService(),即可回调服务中的onBind()方法,调用方可以获取到onBind()方法里的IBinder对象的实例,只要没有断开连接,服务就可一直保持连接状态。
第一次调用:
构造方法——oncreate()——onBind()——onServiceConnected()
结束:unbindService():如果当前有Activity与Service相连——>onUnbind()——>onDestory()
IBinder:在android中用于远程操作对象的一个基本接口,可以实现进度监控
(1)实现ServiceConnection.
必须重写两个回调方法:
onServiceConnected()
系统调用这个来传送在service的onBind()中返回的IBinder.
OnServiceDisconnected()
Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.
(2)调用bindService(),传给它ServiceConnection的实现.
(3)当系统调用onServiceConnected()方法时,就可以使用接口定义的方法们开始调用service了.
(4)与service断开连接,调用unbindService().
(1)第一个bindService()的参数是一个明确指定了要绑定的service的Intent.
(2)第二个参数是ServiceConnection对象.
(3)第三个参数是一个标志,它表明绑定中的操作.它一般应是BIND_AUTO_CREATE,这样就会在service不存在时创建一个.其它可选的值是BIND_DEBUG_UNBIND和BIND_NOT_FOREGROUND,不想指定时设为0即可.
服务需要销毁,否则占用内存,若没有点击销毁服务按键,则可以在MyService任意位置调用stopSelf(); 方法让服务自己停止。
(1)stopSelf():表示直接停止服务(所有次数)
(2)stopSelf(startId):表示停止startId次的服务,其他次数不停止。一般用于多次启动服务。
??????????????????????????????????????????????startId:表示启动服务的次数
//MyService
public class MyService extends Service {
private DownloadBinder mbinder = new DownloadBinder();
static class DownloadBinder extends Binder {
public void startDownload() {
Log.d("MyService", "startDownload");
}
//获取进度
public int getProgress() {
Log.d("MyService", "getProgress executed");
return 0;
}
}
public MyService() {
stopSelf(); //服务自己停止
}
//服务创建时调用
@Override
public void onCreate() {
super.onCreate();
Log.d("MyService", "onCreate executed");
}
// 每次服务启动的时候调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.d("MyService", "onStartCommand executed");
return super.onStartCommand(intent, flags, startId);
}
// 服务销毁的时候调用
@Override
public void onDestroy() {
super.onDestroy();
Log.d("MyService", "onDestroy executed");
}
//绑定方法
@Override
public IBinder onBind(Intent intent) {
// TODO: Return the communication channel to the service.
// throw new UnsupportedOperationException("Not yet implemented");
return mbinder;
}
}
//MainAvtivity
private MyService.DownloadBinder downloadBinder;
private ServiceConnection connection = new ServiceConnection() {
//Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用.
@Override
public void onServiceDisconnected(ComponentName componentName) { }
//系统调用这个来传送在service的onBind()中返回的IBinder.
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
downloadBinder = (MyService.DownloadBinder) iBinder;
downloadBinder.startDownload();
downloadBinder.getProgress();
}
};
public void onClick(View view){
switch (view.getId()){
case R.id.btn_start:
Intent startIntent = new Intent(this,MyService.class);
startService(startIntent); //启动服务
break;
case R.id.btn_stop:
Intent stopIntent = new Intent(this,MyService.class);
stopService(stopIntent); //停止服务
break;
case R.id.btn_bind:
//调用bindService(),传给它ServiceConnection的实现
Intent bindintent = new Intent(this,MyService.class);
bindService(bindintent,connection,BIND_AUTO_CREATE);//绑定服务
//Intent
break;
case R.id.btn_unbind:
//与service断开连接,调用unbindService().
try {
unbindService(connection); //解绑服务
// Log.d("MainActivity", "解绑服务");
}catch (Exception e){
Toast.makeText(this,"服务已解绑",Toast.LENGTH_LONG).show();
}
break;
default:
break;
}
}
需要注意的是:onCreate()方法是在服务第一次创建的时候调用的,而onStartCommand()方法则是每次启动服务的时候都会调用。