1.服务概念
就是默默运行在后台的组件,可以理解为是没有前台的activity,适合用来运行不需要前台界面的代码
服务可以被手动关闭,不会重启,但是如果被自动关闭,内存充足就会重启
2.创建一个服务
1.写一个类继承 Service ,实现onBind方法。
public class MyServer extends Service{
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
}
}
2.在AndroidManifest.xml中进行配制
<service android:name="com.itheima.runservice.MyService"></service>
3.开启服务
Intent intent=new Intent(this, MyServer.class);
startService(intent);
3.服务的生命周期
public class MyService extends Service{
//绑定时调用
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
//解绑时调用
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
return super.onUnbind(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("onStartCommand方法");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
System.out.println("onDestroy方法");
super.onDestroy();
}
@Override
public void onCreate() {
System.out.println("onCreate方法");
super.onCreate();
}
}
Intent intent=new Intent(this, MyServer.class);
startService(intent);
依次调用
重复的调用startService会导致onStartCommand被重复调用
Intent intent=new Intent(this, MyServer.class);
stopService(intent);
service会调用onDestroy
1.startService:服务被启动之后,跟启动它的组件没有一毛钱关系
2.bindService:跟启动它的组件同生共死
绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy
大家有没有想过这样一个场景,在Activity面要调用Service里边的方法。
打个比方,一个人如果要去找办个XX证,但正规的途径有办不到,那么只能找领导了。找领导很定需要一个中间人了。onBind 方法中返回的IBinder对像就是这个中间人。
直接上代码。
startService(intent);
依次调用
03-16 10:33:21.977: I/System.out(18621): onCreate方法
03-16 10:33:21.977: I/System.out(18621): onStartCommand方法
重复的调用startService会导致onStartCommand被重复调用
Intent intent=new Intent(this, MyServer.class);
stopService(intent);
service会调用onDestroy
4.服务的两种启动模式
1.startService:服务被启动之后,跟启动它的组件没有一毛钱关系
2.bindService:跟启动它的组件同生共死
绑定服务和解绑服务的生命周期方法:onCreate->onBind->onUnbind->onDestroy
class MyServiceConnection implements ServiceConnection{
//服务连接成功调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("onServiceConnected方法");
}
//服务失去连接调用
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("onServiceDisconnected方法");
}
}
intent=new Intent(this,MyServer.class);
bindService(intent, conn,BIND_AUTO_CREATE);<span style="color:#008000;">
//解绑度unbindService(conn);
那么这个bindService有什么作用呢???大家有没有想过这样一个场景,在Activity面要调用Service里边的方法。
打个比方,一个人如果要去找办个XX证,但正规的途径有办不到,那么只能找领导了。找领导很定需要一个中间人了。onBind 方法中返回的IBinder对像就是这个中间人。
直接上代码。
public class MyServer extends Service{
//绑定时调用
@Override
public IBinder onBind(Intent intent) {
System.out.println("onBind方法");
return new MyIBinder();
}
//解绑时调用
@Override
public boolean onUnbind(Intent intent) {
// TODO Auto-generated method stub
System.out.println("onUnbind方法");
return super.onUnbind(intent);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
// TODO Auto-generated method stub
System.out.println("onStartCommand方法");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
// TODO Auto-generated method stub
System.out.println("onDestroy方法");
super.onDestroy();
}
@Override
public void onCreate() {
System.out.println("onCreate方法");
super.onCreate();
}
public class MyIBinder extends Binder{
public void bz(){
leaderBz();
}
}
public void leaderBz(){
System.out.println("领导办证方法");
}
}
在MyService 写的一类继承Ibinder 的子类 Binder;在onBind方法中返回Binder继承类的对像。 class MyServiceConnection implements ServiceConnection{
//服务连接成功调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
System.out.println("onServiceConnected方法");
MyIBinder binder=(MyIBinder) service;
binder.bz();
}
//服务失去连接调用
@Override
public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
System.out.println("onServiceDisconnected方法");
}
}
intent=new Intent(this,MyServer.class);
bindService(intent, conn,BIND_AUTO_CREATE);
service连接成功后会在 onServiceConnected方法中返回Binder继承类的对像。就可以调用到bz的方法了。