一.Service 简介
Service是android 系统中的四大组件之一,是一种可以在后台执行长时间运行操作而没有用户界面的应用组件。Service通常总是称之为“后台服务”,它的运行不依赖于任何用户界面,适用于去执行那些不需要和用户交互而且还要求长期运行的任务。
- Service不依赖于用户可视的UI界面并不是绝对的,如前台Service就是与Notification界面结合使用的
- Service的后台运行并不是子线程,Service的运行是在主线程中进行的,只是它没有界面显示而已,它的耗时操作同样需要开启子线程,否者会跟Activity一样出现ANR
二.Service 的分类
- 本地服务(Local)
Service 服务依附在主进程(App所在的进程)上而不是独立的进程,进程(App)被Kill后,服务便会终止。使用本地服务因为是在同一进程,因此不需要进程间通信(IPC、AIDL)。 - 远程服务(Remote)
服务为独立的进程,属于常驻性服务,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,当Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,通信时,需要使用AIDL进行IPC进程通信
三.Service 的启动模式
创建一个 TestService 服务
public class TestService extends Service {
private MyBinder mBinder=new MyBinder();
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
//自定义一个Binder
public class MyBinder extends Binder {
//定义一个方法,用于返回TestService的实例
public TestService getService() {
return TestService.this;
}
}
}
在AndroidManifest中注册服务 TestService
<service
android:name=".service.TestService"
//远程服务需要添加 android:process属性
android:process=":remote" />
startService 启动的服务
Intent intent = new Intent(this, TestService.class);
//开启服务
startService(intent);
//停止服务
stopService(intent);
启动服务startService : –>onCreate()–> onStart()
停止服务stopService : –>onDestroy()
//开启service
onCreate()
onStartCommand()
onStart()
//停止service
onDestroy()
- onCreate()
1.如果service没被创建过,调用startService()后会执行onCreate()
2.如果service已处于运行中,调用startService()不会执行onCreate()方法,也就是说,onCreate()只会
在第一次创建service时候调用,多次执行startService()不会重复调用onCreate(),此方法适合完成一
些初始化工作。 - onStartCommand()、 onStart()(已过时)
如果多次调用startService()方法,那么Service的onStartCommand()和onStart()方法也会相应的多次调用。onStartCommand()方法很重要,我们在该方法中根据传入的Intent参数进行实际的操作,比如会在此处创建一个线程用于下载数据或播放音乐等 - onDestory()
1.如果service没有销毁,调用startService()或者service的stopSelf()方法,调用onDestory()方法
2.如果service已销毁,service不会调用任何方法
bindService 启动的服务
private boolean isBind = false;
private Intent intent;
private ServiceConnection connection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
Log.e(TAG,"the service connected");
isBind = true;
}
@Override
public void onServiceDisconnected(ComponentName name) {
isBind=false;
Log.e(TAG,"the service disconnected");
}
};
// 绑定服务
intent = new Intent(this, TestService.class);
bindService(intent, connection, BIND_AUTO_CREATE);
//解除绑定
unbindService(connection);
1.绑定bindService : –> onCreate() –> onBind()
2.解绑unbindService: –>onUnbind() –>onDestroy()
//绑定服务
onCreate()
onBind()
the service connected
//解除绑定
onUnbind()
onDestroy()
- onCreate()
如果service没被创建过,调用bindService ()后会执行onCreate() - onBind()
1.如果service没被创建过且没有调用bindService ()过,调用bindService ()后会执行onBind()
2.如果已调用bindService ()过,onBind()将不会执行 - onUnbind()
如果已调用bindService () 过,调用unbindService ()方法会执行onUnbind()方法 - onDestroy()
如果service没有销毁,调用unbindService ()方法会执行onDestory()方法
注意:
1.在没有调用bindService()之前,调用unbindService()会报” Service not registered ” 错误,所以 bindService 启动的服务时,要使用服务绑定标记isBind 避免这一情况
2.调用bindService()时,如果 service 的onBind() 方法结果返回null,ServiceConnection 中重写的
onServiceConnected()方法将不会执行
3.调用unbindService()方法时,ServiceConnection 中的onServiceDisconnected()方法正常情况下会执行,Service服务被异外销毁时会执行,例如内存的资源不足时这个方法才被自动调用。
4.在两种服务混合使用时,会出现以下情况
(1)先用startService()启动服务,会执行onCreate()–> onStart() ,然后调用bindService()方法,会执行onBind()方法,现在调用stopService()方法,service不会被销毁,只有调用unbindServcie()方法,service才会被销毁,执行onUnbind() –>onDestroy()
(2) 先用bindService()启动服务,会执行onCreate()–> onBind() ,然后调用startService()方法,会执行onStartCommand()–>onStart() 方法,现在调用stopService()方法,service不会执行任何方法,只有调用unbindServcie()方法,service才会被销毁,执行onUnbind() –>onDestroy()
(3)先调用startService()启动服务,然后调用unbindServcie()方法,service不会执行任何方法。或者,先调用bindService()方法启动服务,然后调用stopServcie()方法,service不会执行任何方法