*在实际运行中同样的Service的确只能有一个。

Services有两种启动形式:

  • Started:其他组件调用startService()方法启动一个Service。一旦启动,Service将一直运行在后台(run in the background indefinitely)即便启动Service的组件已被destroy。通常,一个被start的Service会在后台执行单独的操作,也并不给启动它的组件返回结果。比如说,一个start的Service执行在后台下载或上传一个文件的操作,完成之后,Service应自己停止。

    • 开启方式 :startService() 
      1. SwipeActivity.this.startService(new Intent(SwipeActivity.this, FindCardService.class));
    • 结束方式1:
      1. SwipeActivity.this.stopService(new Intent(SwipeActivity.this, FindCardService.class));
    • 结束方式2:
      1. stopSelf(); // 继承Service的子类内部调用
    • 生命周期:
      1. onCreate() --> onStartCommand() --> onDestroy() // 如果Service已经启动,再次startService(),只会调用onStartCommand()方法,控件销毁时,记得解绑
  • Bound:其他组件调用bindService()方法绑定一个Service。通过绑定方式启动的Service是一个client-server结构,该Service可以与绑定它的组件进行交互。一个bound service仅在有组件与其绑定时才会运行(A bound service runs only as long as another application component is bound to it),多个组件可与一个service绑定,service不再与任何组件绑定时,该service会被destroy。

    • 开启方式:bindService()

      1. SwipeActivity.this.bindService(new Intent(SwipeActivity.this, FindCardService.class), connection, BIND_AUTO_CREATE);
    • 结束方式:unbindService()
      1. SwipeActivity.this.unbindService(connection); // 解绑只能进行一次,不然会出现崩溃: Service not registered
    • 生命周期:
      1. onCreate() --> onBind() --> onDestroy(); // 如果Service已经启动,再次bindService(),没效果
    • 使用如下:
  1. private FindCardService.FindCardBinder mFindCardBinder;
  2. private boolean mBound; // 防止调用unbindService崩溃
  3. private ServiceConnection connection = new ServiceConnection() {
  4. @Override
  5. public void onServiceConnected(ComponentName name, IBinder service) {
  6. CoreLog.d(TAG, "ServiceConnection -- onServiceConnected()");
  7. mFindCardBinder = (FindCardService.FindCardBinder) service;
  8. mBound = true;
  9. }
  10. // 只有在service因异常而断开连接的时候,这个方法才会用到
  11. @Override
  12. public void onServiceDisconnected(ComponentName name) {
  13. CoreLog.d(TAG, "ServiceConnection -- onServiceDisconnected()");
  14. mBound = false;
  15. }
  16. };

绑定:

  1. findViewById(R.id.bangding).setOnClickListener(new View.OnClickListener() {
  2. @Override
  3. public void onClick(View v) {
  4. SwipeActivity.this.bindService(new Intent(SwipeActivity.this, FindCardService.class), connection, BIND_AUTO_CREATE);
  5. }
  6. });

解绑:

  1. @Override
  2. protected void onDestroy() {
  3. super.onDestroy();
  4. if (mBound) {
  5. SwipeActivity.this.unbindService(connection);
  6. }
  7. }

Service:

  1. @Nullable
  2. @Override
  3. public IBinder onBind(Intent intent) {
  4. CoreLog.d(TAG, "FindCardService -- onBind()");
  5. return mFindCardBinder;
  6. }
  7. private FindCardBinder mFindCardBinder = new FindCardBinder();
  8. public class FindCardBinder extends Binder {
  9. public void startFindCard() {
  10. }
  11. }

额外情况:

如果使用了bindService和startService混合使用会是什么情况?

1.stopService()会失效,即使使用了stopService(),不会调用onDestory()方法。

其他的,会按照各自的生命周期来走。

2.当控件都解绑了,才会调用onDestory()方法。

3.在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用)其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。也就是说Activity A 在onCreate()方法中bindService,正常调用onBind(),但没有在onDestory()方法中unbindService。Activity B在onCreate()方法中bindService,但没有调用onBind()方法了。

版权声明:本文为H-BolinBlog原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/H-BolinBlog/p/6183559.html