我正在参加「启航计划」
前言
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 同样有生命周期回调办法
startService 办法的办法回调
onCreate()
->onStartCommand()
->onDestroy()
bindService 办法的办法回调
onCreate()
->onBind()
->onUnbind()
->onDestroy()