1、什么是服务
Service是Android四大组件之一,它可以在后台执行长时间运行操作而没有用户界面的应用组件。
Service的启动方式有两种:startService启动和bindService启动。
-
Service是在main Thread中执行,Service中不能执行耗时操作(网络请求,拷贝数据库,大文件)。
-
可以在xml中设置Service所在的进程,让Service在另外的进程中执行。
-
Service执行的操作最多是20s,BroadcastReceiver是10s,Activity是5s。
-
Activity通过bindService(Intent,ServiceConnection,flag)与Service绑定。
-
Activity可以通过startService和bindService启动Service。
Service分为本地服务(LocalService)和远程服务(RemoteService):
1、本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,
也不需要AIDL。相应bindService会方便很多。主进程被Kill后,服务便会终止。
2、远程服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,
不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。
2、服务的启动方式
Service有3种启动方式
1. startService()
2. bindService()
3. 同时调用
这几种方式启动的Service生命周期略微不同。
startService方式
startService()只要一个Intent参数,指定要开启的Service即可
Intent intent = new Intent(MainActivity.this, MyService.class);复制代码
startService方式启动Service不会调用到onBind()。 startService可以多次调用,每次调用都会执行onStartCommand()。 不管调用多少次startService,只需要调用一次stopService就结束。 如果startService后没有调用stopSelf或者stopService,则Service一直存活并运行在后台。
onStartCommand的返回值一共有3种
当Android面临内存匮乏的时候,可能会销毁掉你当前运行的Service,然后待内存充足的时候可以重新创建Service,Service被Android系统强制销毁并再次重建的行为依赖于Service中onStartCommand方法的返回值。我们常用的返回值有三种值,START_NOT_STICKY、START_STICKY和START_REDELIVER_INTENT,这三个值都是Service中的静态常量。
1.START_NOT_STICKY
如果返回START_NOT_STICKY,表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service,当然如果在其被杀掉之后一段时间又调用了startService,那么该Service又将被实例化。那什么情境下返回该值比较恰当呢?如果我们某个Service执行的工作被中断几次无关紧要或者对And