前言
Service
通常被用来做一些后台操作,并且不依赖于界面。
1. Service调用
自定义DemoService
需要继承Service
,并且在配置文件中声明。
<service android:name=".component.service.DemoService" />
可以在Activity
中启动和停止Service
。
private void startService() {
startService(new Intent(this, DemoService.class));
}
private void stopService() {
stopService(new Intent(this, DemoService.class));
}
Service
生命周期,
首次启动Service
,依次调用onCreate()
和onStartCommand(Intent, int, int)
方法。
如果Service
没有停止,再次启动Service
,只会调用onStartCommand(Intent, int, int)
方法。
停止Service
,调用onDestroy()
方法。
可以指定onStartCommand(Intent, int, int)
的返回值
START_STICKY
:服务被异常kill掉,系统自动重启该服务, 但intent
为null
START_NOT_STICKY
:服务被异常kill掉,系统不会自动重启该服务START_REDELIVER_INTENT
:服务被异常kill掉,系统自动重启该服务, 并且重传intent
START_STICKY_COMPATIBILITY
:START_STICKY
的兼容版本,但不保证服务被kill后一定能重启。
Service
和Activity
同样运行在主线程,费时操作需要添加线程。
2. Service绑定
在Service
中定义一个Binder
,用来返回Service
。
public class DemoService extends Service {
private IBinder binder = new DemoBind();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return binder;
}
public class DemoBind extends Binder {
public DemoService getService() {
return DemoService.this;
}
}
}
在Activity
中需要定义一个ServiceConnection
,用来获取Binder
。
private ServiceConnection sc;
private DemoService service;
private void bindService() {
if (sc == null) {
sc = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder binder) {
service = ((DemoService.DemoBind) binder).getService();
}
@Override
public void onServiceDisconnected(ComponentName name) {
service = null;
}
};
bindService(new Intent(this, DemoService.class), sc, BIND_AUTO_CREATE);
}
}
private void unbindService() {
if (sc != null) {
unbindService(sc);
sc = null;
}
}
绑定Service
的生命周期,
- 绑定
Service
时,依次调用onCreate(Bundle)
和onBind()
方法。 - 解绑
Service
时,依次调用onUnbind(Intent)
和onDestroy()
方法。
在绑定的同时启动Service
- 解绑
Service
,只会调用onUnbind(Intent)
方法。 - 停止
Service
,也不会调用onDestroy()
方法。
3. AIDL服务
AIDL是一个缩写,全称是Android Interface Definition Language
,也就是Android接口定义语言,主要用于跨进程通信。
定义一个AIDL文件,以aidl结尾,自动生成java文件。
interface IAidlInterface {
int add(int val1, int val2);
}
定义AIDL服务,
public class AidlService extends Service {
private AidlInterface mInterface = new AidlInterface();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mInterface;
}
private static class AidlInterface extends IAidlInterface.Stub {
@Override
public int add(int val1, int val2) {
return val1 + val2;
}
}
}
获取AIDL服务,
private IAidlInterface aidlInterface;
private ServiceConnection sc
private void bindAidlService() {
sc = new ServiceConnection(){
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
aidlInterface = IAidlInterface.Stub.asInterface(service);
}
@Override
public void onServiceDisconnected(ComponentName name) {
aidlInterface = null;
}
};
bindService(new Intent(this, AidlService.class), sc, BIND_AUTO_CREATE);
}
需要注册Service
服务,
<service android:name=".component.service.AidlService" android:process=":remote" />