Service详解


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);

依次调用

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的方法了。


 





你可能感兴趣的:(Service详解)