Android面试常客--四大组件之Service
上一篇我们说了四大组件的其中一个Activity,今天我们的主角是Service,这个组件也是面试的常客,基本上面试官都会问到有关Service的问题,比如:如何启动Service、Service的生命周期等等,下面一一解剖!
Q:Service的生命周期
A:
Q:如何保证Service不被杀死?
A:就这个问题就可以写一篇很长的文章了!!
Service设置成START_STICKY kill 后会被重启(等待5秒左右),重传Intent,保持与重启前一样
通过 startForeground将进程设置为前台进程, 做前台服务,优先级和前台应用一个级别,除非在系统内存非常缺,否则此进程不会被 kill
双进程Service: 让2个进程互相保护**,其中一个Service被清理后,另外没被清理的进程可以立即重启进程
QQ黑科技: 在应用退到后台后,另起一个只有 1 像素的页面停留在桌面上,让自己保持前台状态,保护自己不被后台清理工具杀死
在已经root的设备下,修改相应的权限文件,将App伪装成系统级的应用 Android4.0系列的一个漏洞,已经确认可行
用C编写守护进程(即子进程) : Android系统中当前进程(Process)fork出来的子进程,被系统认为是两个不同的进程。当父进程被杀死的时候,子进程仍然可以存活,并不受影响。鉴于目前提到的在Android->- Service层做双守护都会失败,我们可以fork出c进程,多进程守护。死循环在那检查是否还存在,具体的思路如下(Android5.0以上的版本不可行)
用C编写守护进程(即子进程),守护进程做的事情就是循环检查目标进程是否存在,不存在则启动它。
在NDK环境中将1中编写的C代码编译打包成可执行文件(BUILD_EXECUTABLE)。主进程启动时将守护进程放入私有目录下,赋予可执行权限,启动它即可。
联系厂商,加入白名单
Q:Service与Activity之间通信的几种方式
A:
1、通过Binder
2、通过Broadcast广播
Q:如何启用Service,如何停用Service?
A:
- startService:生命周期和调用者不同.启动后若调用者未调用stopService而直接退出,Service仍会运行
- bindService:生命周期与调用者绑定,调用者一旦退出,Service就会调用unBind->onDestory
Q:Service和Thread的区别?
A:
1、定义方面区别
Thread是程序执行的最小单元(线程),它是分配CPU的最小单位,可以用它来执行一些异步操作。
service是android的一种机制,当它运行的时候,如果是本地的service,那么它对应的线程是主线程,(也可以理解为,service依托于它所在的主线程),所以相比而言,Thread是很独立的。
2、实际开发中方面区别。
Thread可以执行耗时操作。
service试运行在主线程,不可以做耗时操作。如果需要必须开启一个子线程来操作耗时任务。
3、应用场景方面区别。
Thread,经常用在、数据下载、数据上传,图片加载,等大数据交互的情况下。
service,经常用在,需要长时间运行在后台,并且不需要数据交互,才会使用,比如闹钟,天气预报,后台播放音乐等。
Q:IntentService有何优点?
A:
一、IntentService 简介
IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。先看 Service 本身存在两个问题:
Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中;
Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务;
二、IntentService 特征
会创建独立的 worker 线程来处理所有的 Intent 请求;
会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题;
所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service;
为 Service 的 onBind()提供默认实现,返回 null;
为 Service 的 onStartCommand 提供默认实现,将请求 Intent 添加到队列中;
个人拙见,会不断补充和修正
To Be Continued…