一、Service详解
Service的运行不依赖于任何用户界面。当某个应用程序进程被杀掉时,所有依赖于该进程的服务也会停止运行。Service默认并不会运行在子线程中,也不运行在一个独立的进程中,它同样执行在主线程中。
(1)生命周期状态
- onCreate:首次创建服务时调用。服务已在运行,不会调用此方法,该方法只调用一次。
- onDestroy:当服务不再使用且将被销毁时调用。
- startService:启动服务
- onStartCommand:组件通过调用startService()请求启动服务时调用。
- stopService:关闭服务
- bindService:绑定服务
- onBind:组件通过调用bindService()与服务绑定时调用。
- unbindService:解绑服务
- onUnbind:组件通过调用unbindService()与服务解绑时调用。
- onRebind:旧的组件与服务解绑后,新的组件与服务绑定,onUnbind()返回true时调用。
(2)两种启动Service服务方式
- 启动Service服务
单次:startService() onCreate() onStartCommand()
多次:startService() onCreate() onStartCommand() onStartCommand() - 停止Service服务
stopService() onDestroy()
无论调用多少次startService()方法,只需调用一次stopService()或stopSelf()方法,服务就会停止了。 - 绑定Service服务
bindService() onCreate() onBind() - 解绑Service服务
unbindService() onUnbind() onDestroy() - 启动绑定Service服务
startService() onCreate() onStartCommand() bindService() onBind() - 解绑停止Service服务
unbindService() onUnbind() stopService() onDestroy() - 这两种启动方法并不冲突,当使用startService()启动Service之后,还可再使用bindService()绑定,只不过需要同时调用 stopService()和 unbindService()方法才能让服务销毁掉。
(3)Service使用
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
super.onDestroy();
}
}
- 在配置文件中进行注册。
<service android:name=".MyService" />
- 在活动中利用Intent可实现Service的启动。
Intent intent = new Intent(this, MyService.class);
startService(intent);
(4)其他Service
- 前台Service:在MyService的onCreate创建Notification实例,调用startForeground()方法
- 系统Service:通过getSyetemService()方法并传入一个Name就可以得到相应的服务对象。
ALARM_SERVICE:闹钟服务
POWER_SERVICE:电源服务
KEYAUARD_SERVICE:键盘锁服务
NOTIFICATION_SERVICE:状态栏服务
WINDOW_SERVICE:管理打开的窗口程序
ACTIVITY_SERVICE:管理应用程序的系统状态 - IntentService:异步的、会自动停止的服务
(5)Service与Activity的通信
public class MyService extends Service {
private MyBinder myBinder = new MyBinder();
@Override
public void onCreate() {
super.onCreate();
System.out.println("执行了onCreate");
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
System.out.println("执行了onStartCommand");
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onDestroy() {
System.out.println("执行了onDestroy");
super.onDestroy();
}
//返回定义好的MyBinder类
@Nullable
@Override
public IBinder onBind(Intent intent) {
System.out.println("执行了onBind");
return myBinder;
}
@Override
public boolean onUnbind(Intent intent) {
System.out.println("执行了onUnbind");
return super.onUnbind(intent);
}
//自定义一个类MyBinder并继承Binder,在它的内部提供关联了activity方法
class MyBinder extends Binder {
void serviceActivity(){
System.out.println("Service关联Activity");
}
}
}
Activity代码
private MyService.MyBinder myBinder;
//Activity中实例化一个ServiceConnection类
private ServiceConnection serviceConnection = new ServiceConnection() {
//服务成功绑定时调用
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
myBinder = (MyService.MyBinder) service;
myBinder.serviceActivity();
}
//解除绑定时调用
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
//绑定Service
Intent bindIntent = new Intent(this, MyService.class);
bindService(bindIntent, serviceConnection, BIND_AUTO_CREATE);
//解绑Service
unbindService(serviceConnection);