Service知识梳理
startService
startService第一次启动会调用onCreate
,onCreate
只会在创建的时候调用一次,之后多次启动会多次调用onStartCommand
。stopService
会停止Service,多次调用stopService
不会报错。
bindService
bindService第一次启动会依次调用onCreate
->onBind
->onServiceConnected
。多次调用bindService
, onBind
和onServiceConnected
都不会多次回调。多次调用unBindService
会报错。
startCommand
- START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,由于服务状态为开始状态,所以创建服务后一定会调用onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到service,那么参数Intent将为null。
- START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。
- START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将Intent的值传入。
- START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。
服务在其托管进程的主线程中运行的
Q:谈一谈Service的生命周期?
Q:Service的两种启动方式?区别在哪?
启动
- 开启服务的组件退出之后,服务还是可以在后台长期运行的。其他组件可以调用stopService(Intent)或者自身调用stopSelf停止
- 组件不能调用服务里面的方法
绑定
- 组件销毁后服务自动被销毁,如果一个Service被多个组件绑定,只有所有的组件被销毁这个服务才会销毁
- 组件可以调用服务里面的方法
Q:一个Activty先start一个Service后,再bind时会回调什么方法?此时如何做才能回调Service的destory()方法?
同时调用stopService
和unbindService
才可以回调onDestory
Q:Service 的生命周期方法 onCreate、onStart、onBind 等运行在哪个线程?
都运行在主线程
Q:Service如何和Activity进行通信?
- 使用
Intent
,onStartCommand
时候传入的Intent
BroadcastReceiver
,Service发送,Activity接收- 接口回调
- 共享硬盘存储,共享内存
ServiceConnection
Q:用过哪些系统Service?
获取系统Service一般用getSystemService
方法。常见的Service有
- LayoutInflater inflater = (LayoutInflater)getSystemService(LAYOUT_INFLATER_SERVICE);
- ActivityManagerService
- PackageManagerService
- WindowManagerService
参考这里
Q:是否能在Service进行耗时操作?如果非要可以怎么做?
不能。因为服务在其托管进程的主线程中运行,它既不创建自己的线程,也不在单独的进程中运行(除非另行指定)。它不可以做密集耗时的操作。如果非要做的话,可以启动一个新的线程来工作。
Q:前台服务是什么?和普通服务的不同?如何去开启一个前台服务?
- 前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。 前台服务必须为状态栏提供通知,放在“正在进行”标题下方,这意味着除非服务停止或从前台移除,否则不能清除通知。
- 要请求让服务运行于前台,请调用
startForeground()
。此方法采用两个参数:唯一标识通知的整型数和状态栏的 Notification。
Q:AlarmManager能实现定时的原理?
Q:是否了解ActivityManagerService,谈谈它发挥什么作用?
Q:如何保证Service不被杀死?
- 相互唤起,需要借助其他APP
- service 相互使用广播唤起 (鸡肋)
- 和手机商合作 (最高效)
- 设置 service 等级,priority (鸡肋)
- onStartCommand方法,返回 START_STICKY,内存充足的时候会重启 (鸡肋)