Service是一个应用组件,它表示一个应用期望去执行一个不与用户交互的较长的操作或者通过一些功能为其他应用去使用。
作为android四大组件之一,Activity负责与用户交互,而Service则负责不与用户交互的那些工作,比如后台下载,后台播放音乐等需在后台长期运行的服务。
无用户界面、在后台运行、生命周期长
service有两种生命周期,由于启动方式不同生命周期也不同。
startService()
@Override
public void onCreate() {
super.onCreate();
// 创建服务
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
return super.onStartCommand(intent, flags, startId);
// 开始服务
}
@Override
public void onDestroy() {
super.onDestroy();
// 销毁服务
}
bindService()
@Override
public void onCreate() {
super.onCreate();
// 创建服务
}
@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();
// 销毁服务
}
绑定服务
通过bindService()启动的Service
// 绑定服务
ServiceConnection mConnection = ServiceConnection() { ... };
Intent intent = new Intent(this, MyService.class);
bindService(intent, mConnection, Context.BIND_AUTO_CREATE);
解除绑定
// 解除绑定
unbindService(mConnection);
关于绑定Service的流程
启动服务
// 启动服务
Intent intent = new Intent(this, MyService.class);
startService(intent);
停止服务
stopService(intent)
关于非绑定服务
与服务间的通信大体有一下三种
服务可以通过调用startForeground来转变为前台优先级
public final void startForeground(int id, Notification notification)
这个方法最后还是要调NotificationManager.notify(int id, Notification notification)
所以前面的id 就相当于notify方法的id,notification就是我们的通知体
如果你想从前台移除这个Service了,那就调用stopForeground
public final void stopForeground(boolean removeNotification)
参数是一个移除通知的标识,如果服务在前台运行时候被停止,状态栏的通知也会被移除。
大体先总结一下几点:
然而这两种方式也并不是完全分开的,在我看来只是不同地方不同用法而已
也就是说我们start了一个Service之后,如果你想与之绑定,对内部进行操作,还是可以bindService的,只不过如果你bind了之后stopService()或 stopSelf()实际上并不能停止这个service,除非所有的客户都解除绑定。
我这里有一篇Service&IntentService的博客讲了关于两个的不同
Service 的用途还是很广的,还是得多看博客,多看源码,多写多用才能融会贯通