Service之startservice与bindservice

来源:互联网 发布:编程语言论坛 编辑:程序博客网 时间:2024/06/11 09:14

之前的项目用到了service,对于这个组件一直是一知半解的。今天有时间总结下:

1,启动一个service有两种方法:context.startservice与context.bindservice

2.   service的生命周期:context.startservice来启动的时候oncreate()~onstartcommand()~context.stopService()~ondestory()

                                       context.bindservice来启动是:oncreate()~onbind()~onunbind()~ondestory()

                    其中1),用bindservice来启动时,调用者,如activity,fragment与service实例绑定在一起,调用者退出,则service也结束

                   用startservice来调用时,即使app退出,service依然运行

  2)混合避免使用着两种


service生命周期

3.context.bindservice的使用方法:

     A:   在service里写一个继承自binder的内部类用以得到service的实例

                   重写onbind方法返回一个重写的binder实例

                        eg:

               public class LocalService extends Service {


               private static final String TAG = "LocalService"; 
               private IBinder binder=new LocalService.LocalBinder();
    
              @Override
    public IBinder onBind(Intent intent) {
         
        return binder;
    }
          @Override 
    public void onCreate() { 
            Log.i(TAG, "onCreate"); 
            //这里可以启动媒体播放器
            super.onCreate(); 
    } 


    @Override 
    public void onStart(Intent intent, int startId) { 
            Log.i(TAG, "onStart"); 
            super.onStart(intent, startId); 
    } 


    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
          Log.i(TAG, "onStartCommand"); 
        return START_STICKY;
    }


    
    
    @Override 
    public void onDestroy() { 
            Log.i(TAG, "onDestroy"); 
            super.onDestroy(); 
    } 


    
    //定义内容类继承Binder
    public class LocalBinder extends Binder{
        //返回本地服务
        LocalService getService(){

return LocalService.this;

}
    }
    
}


B):      在调用者里 重写一个serviceconnection

eg:


new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName componentName, IBinder binder) {
//调用bindService方法启动服务时候,如果服务需要与activity交互,
//则通过onBind方法返回IBinder并返回当前本地服务
localService=((LocalService.LocalBinder)binder).getService();
//这里可以提示用户,或者调用服务的某些方法
}

@Override
public void onServiceDisconnected(ComponentName componentName) {
localService=null;
//这里可以提示用户
}
}
}
C):调用时用context.bindservice(new intent(LocalService.class),new connection,
Context.BIND_AUTO_CREATE

0 0
原创粉丝点击