我正在参加「启航计划」

前言

Service(服务)是 Android 四大组件之一,首要作用是履行后台操作,Android中 Activity 供给了 UI 界面可与用户交互,而 Service 则没有 UI 界面,一切操作都是在后台完结。

Service 与 Activity 一样也可由其它应用程序发动,即运用户切换到其它应用,Service 仍可保持在后台运转。

一个组件能够与 Service 进行绑定(bind)来与 Service 进行交互,亦能够进行进程间通讯(IPC)。 往常开发中运用 Service 进行网络恳求、播映音乐、文件 I/O 等操作。

Service的运用

创立Service

自定义一个类承继 Service 并完成对应办法来创立Service

public class TestService extends Service {
  @Override
  public void onCreate() {
    super.onCreate();
  }
  @Override
  public int onStartCommand(Intent intent, int flags, int startId) {
    return super.onStartCommand(intent, flags, startId);
  }
  @Nullable
  @Override
  public IBinder onBind(Intent intent) {
    return null;
  }
  @Override
  public boolean onUnbind(Intent intent) {
    return super.onUnbind(intent);
  }
  @Override
  public void onDestroy() {
    super.onDestroy();
  }
}

注意:一切自定义的 Service 都需要在 Manifest 里进行声明

<manifest ... >
  ...
  <application ... >
    <service android:name="xxx.TestService" />
    ...
  </application>
</manifest>

<service>标签里将android:exported特点设置为false 可防止其他程序来发动自己App的 Service。

发动Service

通常情况下有两种办法来发动 Service,调用startService()bindService()

  • startService 办法发动
Intent intent = new Intent(context, TestService.class);
// 敞开服务
startService(intent);
// 停止服务
stopService(intent); 

其他组件经过调用startService()发动 Service 后,Service 可在后台无限期运转,即使发动 Service 的组件被毁掉也不受影响。 一般情况下startService()是履行单一操作,不会将履行成果回来给调用者。例如,可能是下载文件或许上传文件,操作完结后会自动停止。

这种办法答应多个组件一起对同一 Service 进行startService()操作,但只要有其中有一个组件调用了stopSelf()stopService(), 该 Service 就会被毁掉。

  • bindService() 办法发动
Intent intent = new Intent(this, TestService.class);
ServiceConnection connection = new ServiceConnection() {
  @Override
  public void onServiceConnected(ComponentName name, 
                                 IBinder service) {
  }
  @Override
  public void onServiceDisconnected(ComponentName name) {
  }
};
// 绑定服务
bindService(intent, connection, Context.BIND_AUTO_CREATE);
// 解绑服务
unbindService(aidlConnection);

组件经过调用bindService()发动 Service ,Service 就处于绑定状况。供给 client – service 的接口,可让调用者与 Service 进行发送恳求和回来成果的操作,还能够进行进程间的通讯(IPC)。

一个组件对该 Service 进行绑定,那该 Service 就不会毁掉。若多个组件一起对一个 Service 进行绑定,只要悉数绑定的该 Service 的组件都解绑后,Service 才会毁掉。

注意运用startService()发动 Service 后,也是能够进行绑定的。

尽管 Service 是在后台运转,但其实仍是在主线程中进行一切的操作。Service 发动时除非单独进行了定义,否则没有单独敞开线程或许进程都运转在主线程中。

任何能阻塞主线程的操作(如:播映音乐或许网络恳求),应该在 Service 中单独敞开新线程来进行操作,否则很容易出现 ANR。

重写几个重要办法

onCreate()

第一次发动 Service 时会调用此办法,用于初始化。若 Service 已发动,该办法不会再被调用。

onStartCommand()

一个组件经过调用startService()来发动 Service 时,会调用该办法。履行该办法后,Service 会发动并在后台无限期履行。

完成该办法,在 Service 履行完后,需要调用 stopSelf() 或 stopService() 来结束Service。

onBind()

某个组件经过调用bindService()绑定的办法来发动 Service 时,会调用该办法。完成此函数时,要回来一个 IBinder 的承继类,来与 Service 进行通讯。

这个是默认必须要重写的,若不想经过绑定的办法来发动 Service,能够直接回来null

onDestroy()

Service 被毁掉时,会回调该办法。若有用到 thread、listeners、receivers 等,应该将这些目标的回收整理写在该办法内。

Service生命周期

Service 同样有生命周期回调办法

Android开发中,正确认识和使用Service

startService 办法的办法回调

onCreate()->onStartCommand()->onDestroy()

bindService 办法的办法回调

onCreate()->onBind()->onUnbind()->onDestroy()