服务是在后台运行,可以理解为是没有界面的activity,定义一个类继承Service。由于没有界面所以和界面有关的生命周期,Service都没有。
//定义服务需要在清单文件配置,服务也可以配置Intent-Filter
public class FirstService extends Service {
@Override
public IBinder onBind(Intent intent){
return null;
}
//当服务第一次开启的时候调用
@Override
public void onCreate(){
super.onCreate();
}
@Override
public int onStartCommand(Intent intent,int flags,int startId){
return super.onStartCommand(intent, flags, startId);
}
//服务销毁的时候执行
@Override
public void onDestory(){
super.onDestory();
}
}
1、start方式开启服务的特点
Intent intent = new Intent(,FirstService.class);
//开启服务
startService(intent);
销毁服务
Intent intent = new Intent(,FirstService.class);
stopService(intent);
1、多次执行startService(intent),也只会执行一次onCreate生命周期,但是onStartCommand会执行多次。
onCreate -> onStartCommand -> onStartCommand -> onStartCommand
2、如果不主动调用stopService销毁服务,会一直在后台运行,可以在设置页面里面的running里面找得到这个服务。
2、bind方式开启服务的特点
1、执行bindService(intent,conn,flag)的生命周期
onCreate -> onBind
2、多次执行bindService没有反应,不会重复调用onBind,退出当前activity,会报错:
解决方法是需要取消绑定服务,执行unbindService();
3、当Activity销毁的时候服务也会销毁
4、通过bind方式开启服务,服务不能在设置页面里面找到,相当于一个隐型的服务。
5、bindservice不能多次解绑,多次解绑会报错
public class MainActivity extends Activity{
MyConn conn;
@Override
public void onCreate(Bundle onSaveInstanceState){
...
}
public void click(View v){
Intent intent = new Intent(this,FirstService.class);
conn = new MyConn();
//连接到服务
bindService(intent,conn, BIND_AUTO_CREATE);
}
private class MyConn implements ServiceConnection {
@Override
public void onServiceConnected(ComponentName name, IBinder service){
}
@Override
public void onServiceDisconnected(ComponentName name){
}
}
@Override
protected void onDestory(){
//当activity销毁的时候,取消绑定服务
unbindService(conn);
}
}