基本定义:是Android中实现程序后台运行的解决方案,服务不是运行在一个独立的进程中,而是依赖创建服务的应用程序进程。当应用程序被干掉的时候,服务也会随之停止。
1.本地服务:服务和启动服务的activity在同一个进程中,该服务依附主进程而不是独立的进程
2.远程服务:对应进程名格式为所在包名加上你指定的android:process字符串,一般的定义方式为android:process=".service",一般用于系统的service,这种服务是常驻的,指的是服务和启动服务的activityv不在同一进程中。
注意:启动本地服务用的是显式启动,远程服务为隐式启动
服务的俩种状态:
一、非绑定模式:
public class MyService extends Service {
private String TAG = "测试Service";
@Nullable
@Override
public IBinder onBind(Intent intent) {
Log.e(TAG, "onBind: " );
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand: " );
return super.onStartCommand(intent, flags, startId);
}
@Override
public void onCreate() {
Log.e(TAG, "onCreate: " );
super.onCreate();
}
@Override
public boolean onUnbind(Intent intent) {
Log.e(TAG, "onUnbind: " );
return super.onUnbind(intent);
}
@Override
public void onDestroy() {
Log.e(TAG, "onDestroy: " );
super.onDestroy();
}
}
(1)正常启动关闭(2)正常启动并重复点击启动再关闭
- 新建类并继承Service且必须重写onBind()方法,有选择的重写onCreate()、onStartCommand()及onDestroy()方法。
- 在配置文件中进行注册。学到现在会发现,四大组件除了广播接收器可用动态注册,其他需要定义好组件之后都要完成在配置文件注册的这一步。
二、绑定模式
当我们第一次点击绑定服务时,LocalService服务端的onCreate()、onBind方法会依次被调用,此时客户端的ServiceConnection#onServiceConnected()被调用并返回 LocalBinder 对象,接着调用LocalBinder#getService方法返回myservice 实例对象,此时客户端便持有了myservice 的实例对象,也就可以任意调用myservice类中的声明公共方法了。更值得注意的是,我们多次调用bindService方法绑定LocalService服务端,而LocalService得onBind方法只调用了一次,那就是在第一次调用bindService时才会回调onBind方法。
关键点记录:
如何保证Service不被杀死
1.在Service的onStartCommand()中设置flages的值为START_STICKY,使服务被杀死后再次启动
2.提升服务的优先级,比如设置一个前台服务
3.在Activity销毁的时候发送广播,在广播接收器中再次启动服务。
前台服务和普通服务最大的区别是,前者会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果。使用前台服务或者为了防止服务被回收掉,比如听歌,或者由于特殊的需求,比如实时天气状况。
详细理解如下地址:
关于Android Service真正的完全详解,你需要知道的一切_zejian的博客-CSDN博客_service