理解 BindService 与 StartService


Service 不像Activity有那么多得生命周期方法, 
Service 只有两种状态 启动 没启动 
启动时 会调用 onCreate
死掉时, 即状态变为没启动时, 会回调 onDestroy方法

调用 startService 时 Service会执行
     onCreate (如果Service没有启动则会执行该方法)
     onStart
     oStartCommand

调用 bindService 时  Service 会执行
     onCreate(如果Service没有启动则会执行该方法)
     onBind 方法 (第一个客户端 bind 才会执行)

startService 和 bindService 都很好理解,
startService 只是单纯的启动Service ,可以调用多次, 如果Service 没有启动则则Service会自己启动
bindService  只是单纯的连接Service ,一个connection只能调用一次, 即使调用多次页没反应. 如果Service没有启动则Service会自己启动

接下来看stopService 停止服务,
当没有客户端 bind连接到Service时, 调用stopService 可以停掉Service , 会回调 OnDestroy方法
当有客户端bind连接到Service时, 调用stopService 不能停掉Service.

但是如果执行了stopService 可以理解为, 调用startService 的人, 与Service 没有任何关系了.

接下来看, unbindService 方法, 解除与Service的绑定.
需要注意的是, 可以有多个客户端连接Service,
只有在第一个客户端调用bindService 时, Service 才会执行 onBind方法
只有在最后一个客户端调用unBindService时, Service 才会执行onUnbind方法

当最后一个客户端调用unBindService时,
如果 Service 与 调用startService 的人 还有关系, 那么Service不会自己停掉
如果Service 与调用startService 的人 没有任何关系了, 或压根就没这个人, 即没有调用过startService 方法,
那么 Service 会自己停掉,会回调 OnDestory方法

在没有该客户端没有bindService 时, 调用unBindService是, 则会抛出异常
java.lang.IllegalArgumentException: Service not registered

在测试过程中发现:
当启动 了某个service 然后 app中途崩溃了, 前提进程没所有死掉
那么在重启启动 app时 Service 会自己启动

上面都已写结论性质的东西下面在看看部分实现代码 
下面是Activity的部分代码
mStartButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        startService(intent);
    }
});
mStopButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        stopService(intent);
    }
});
mBindButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        bindService(intent, mServiceConnection, Context.BIND_AUTO_CREATE);
    }
});
mUnBindButton.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        unbindService(mServiceConnection);
    }
});

mBindButton2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        bindService(intent, mServiceConnection2, Context.BIND_AUTO_CREATE);
    }
});
mUnBindButton2.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        unbindService(mServiceConnection2);
    }
});

private ServiceConnection mServiceConnection = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        LogUtil.d(TAG, "onServiceConnected");
        if (service != null) {
            mMyService = ((MyService.ServiceBinder) service).getService();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        LogUtil.d(TAG, "onServiceConnected");
        mMyService = null;
    }
};
private ServiceConnection mServiceConnection2 = new ServiceConnection() {
    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        LogUtil.d(TAG, "onServiceConnected2");
        if (service != null) {
            mMyService = ((MyService.ServiceBinder) service).getService();
        }
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        LogUtil.d(TAG, "onServiceConnected2");
        mMyService = null;
    }
};

下面是Service的部分代码

public class MyService extends Service {
    public static final String TAG = "MyService";

    private IBinder mIBinder;

    @Override
    public void onCreate() {
        super.onCreate();
        LogUtil.d(TAG, "onCreate");
    }

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

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        LogUtil.d(TAG, "onStartCommand");
        return super.onStartCommand(intent, flags, startId);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        LogUtil.d(TAG, "onDestroy");
    }

    @Override
    public void onRebind(Intent intent) {
        super.onRebind(intent);
        LogUtil.d(TAG, "onRebind");
    }

    @Nullable
    @Override
    public IBinder onBind(Intent intent) {
        LogUtil.d(TAG, "onBind");
        if (mIBinder == null) {
            mIBinder = new ServiceBinder();
        }

        return mIBinder;
    }

    class ServiceBinder extends Binder {
        public MyService getService() {
            return MyService.this;
        }
    }

    @Override
    public boolean onUnbind(Intent intent) {
        LogUtil.d(TAG, "onUnbind");
        return super.onUnbind(intent);
    }
}





你可能感兴趣的:(android,startService,bindService)