Q:启动与停止Service两种方式
- 第一种通过startService()与stopService()启动和停止服务,Service与启动它的Activity无法进行通信和数据交换
- 第二种通过bindService()与unbindService()启动和停止服务。在启动时,通过bindService(Intent, ServiceConnection, int)启动服务,unbindService(ServiceConnection) 停止服务。启动ServiceConnection参数为交互数据的对象
Q:Activity和Service的交互方式主要有以下几种?
- 通过广播进行交互
- bindService()启动service,进行交互
- 通过共享文件
- Messenger
- AIDL
Q:onStartCommand的几种返回值有什么效果?
- START_STICKY:表示Service运行的进程被Android系统强制杀掉之后,Android系统会将该Service依然设置为started状态(即运行状态),但是不再保存onStartCommand方法传入的intent对象,然后Android系统会尝试再次重新创建该Service,并执行onStartCommand回调方法,但是onStartCommand回调方法的Intent参数为null,也就是onStartCommand方法虽然会执行但是获取不到intent信息。如果你的Service可以在任意时刻运行或结束都没什么问题,而且不需要intent信息,那么就可以在onStartCommand方法中返回START_STICKY,比如一个用来播放背景音乐功能的Service就适合返回该值。
- START_REDELIVER_INTENT:表示Service运行的进程被Android系统强制杀掉之后,与返回START_STICKY的情况类似,Android系统会将再次重新创建该Service,并执行onStartCommand回调方法,但是不同的是,Android系统会再次将Service在被杀掉之前最后一次传入onStartCommand方法中的Intent再次保留下来并再次传入到重新创建后的Service的onStartCommand方法中,这样我们就能读取到intent参数。只要返回START_REDELIVER_INTENT,那么onStartCommand重的intent一定不是null。如果我们的Service需要依赖具体的Intent才能运行(需要从Intent中读取相关数据信息等),并且在强制销毁后有必要重新创建运行,那么这样的Service就适合返回START_REDELIVER_INTENT。
- START_NOT_STICKY:表示当Service运行的进程被Android系统强制杀掉之后,不会重新创建该Service
Q:service保活有哪些方法?
- onStartCommand方法返回START_STICKY或者START_REDELIVER_INTENT;
- 提高Service的优先级,在AndroidManifest.xml文件中对于intent-filter可以通过android:priority = "1000"这个属性设置最高优先级,1000是最高值,如果数字越小则优先级越低,同时适用于广播。
- 在Service即将销毁的时候重新启动;或者注册一个广播,然后在service的onDestroy中发送广播,在广播中实现拉起;
- 提升service进程优先级,使用前台服务;
- 通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的Service是否还存活
- 开启一个守护进程,实时监听;
- AlarmManager + JobScheduler;
- 双进程守护,AIDL方式单进程、双进程方式保活Service;
- 白名单:跳转到系统白名单界面让用户自己添加app进入白名单;
- 安装到system/app,使其成为系统应用。
Q:xxx?
- qqq