Service及用Service实现电话窃听

简介: Service的引入 有的操作比较耗时(如:文件IO操作,大量数据的数据库操作,访问网络等),我们希望它们在后台运行,不耽误当前的操作,这就引入了Service概念.

Service的引入
有的操作比较耗时(如:文件IO操作,大量数据的数据库操作,访问网络等),我们希望它们在后台运行,不耽误当前的操作,这就引入了Service概念.
Android中的服务类似windows中的服务,一般没有用户操作界面,它运行于系统中不容易被用户发觉

服务的生命周期回调方法

当采用Context.startService()方法启动服务,与之有关的生命周期方法
onCreate()----->onStartCommand()----->onDestroy()
onCreate()该方法在服务被创建时调用,该方法只会被调用一次,无论调用多少次startService()或bindService()方法,服务也只被创建一次!!!
onStartCommand() 只有采用Context.startService()方法启动服务时才会回调该方法.该方法在服务开始运行时被调用.
多次调用startService()方法尽管不会多次创建服务实例,但onStartCommand()方法会被多次调用.
onDestroy()该方法在服务被终止时调用.

 

当采用Context.bindService()方法启动服务,与之有关的生命周期方法
onCreate()----->onBind()----->onUnbind()----->onDestroy()
onBind()只有采用Context.bindService()方法启动服务时才会回调该方法.
该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()并不会导致该方法被多次调用,服务也只被创建一次!!!
onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法.该方法在调用者与服务解除绑定时被调用.


Service实现电话窃听思路:
1 建立一个广播接收者,接收系统发出的开机启动广播
2 在接收到开机启动广播后,我们在接收者中使用一个意图去激活服务
3 来电时开始录音,挂断后将录音上传至网络

步骤:
1 自定义PhoneService继承自Service
2 在清单文件中完成组件的注册和权限的声明
3 完成代码


注意:
1 可调用Context.startService()或Context.bindService()方法启动服务.这两个方法都可启动Service,但使用场合有所不同.
  使用startService()方法启用服务,访问者与服务之间没有关连,即使访问者退出了,服务仍然运行.
  使用bindService()方法启用服务,访问者与服务绑定在了一起,访问者一旦退出,服务也就终止
2 通过startService()和stopService()启动关闭服务.适用于服务和访问者之间没有交互的情况.
  如果服务和访问者之间需要方法调用或者传递参数,则需使用bindService()和unbindService()启动和关闭服务

采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法,这个时候访问者和服务绑定在一起.
如果访问者要与服务进行通信,那么onBind()方法必须返回Ibinder对象.如果访问者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法.
如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用).
如果访问者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()和onDestroy()方法.

////////////////////////////以下为Service笔记的补遗,来自Sundy的课程/////////////////////////////////////////////

Service不是一个独立的线程(进程)

启动服务后,按Home,服务还会继续运行
启动服务后,退出进程,服务不会继续运行
启动服务,不用多线程,界面会阻塞.如在一个Activity中点击一个按钮,启动一项服务.该service在100秒的时间内不停地用Log进行信息的输出.
此时我们按返回键,或者多次联系按返回键,将导致ANR错误.
但是我们在服务中新开启一个线程来用Log进行信息的输出,就不会导致ANR错误.

由于startService()通常只启动,不需要返回值,所以可用来操作网络上传或者下载,操作完成后,自动停止


startService()启动服务,若在服务的public void onCreate()方法里开启一条线程做一些操作
这时候有这么一个问题:虽然我们使服务终止了,服务的onDestroy()方法也执行了,但是此线程还是在继续工作……………………

不但此问题,有时候发现service莫名其妙的阻塞.
于是android系统引入了IntentService:主要用来执行异步请求,里面也使用了Handle


另外的一个问题:
Service运行在后台,优先级较低,当内存不足的时候,系统会杀死服务.
解决办法:把service运行在前台
方法:startForeground (int id, Notification notification)

知识点:
native service(内部为C++)
当startService()和bindService都不好使的时候而且需要这个服务长期运行在后台的时候,可以调用此方法.
调用此方法需用到NDK是开发C++的插件.
但Java如何调用C++写好的类库呢???答:通过JNI(java native interface即java的原生接口)

Service和线程的选择
在当前操作要启动一个更加独立的操作的时候,可以调用线程.比我就是需要下载一个东西.


Stub是一个指针,指向了指向内存块的指针即Stub为指针的指针

相关文章
|
4月前
|
Kubernetes 开发者 微服务
揭秘CKA认证:Service四层代理的神秘面纱
【4月更文挑战第1天】:揭秘CKA认证:Service四层代理的神秘面纱
69 0
|
27天前
|
消息中间件 网络协议 网络安全
【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链
【Azure 服务总线】使用Azure Service Bus 时,出现证书错误: 所使用的证书具有无法验证的信任链
|
4月前
service 后台服务管理
service 后台服务管理。
28 1
|
27天前
|
网络安全
【Azure Service Bus】启用诊断日志来获取客户端访问Azure Service Bus的IP地址 [2024-03-26 实验结果失败]
【Azure Service Bus】启用诊断日志来获取客户端访问Azure Service Bus的IP地址 [2024-03-26 实验结果失败]
|
27天前
|
Linux 开发工具 Windows
【Azure 应用服务】"App Service"如何能判断自身网路没有问题?
【Azure 应用服务】"App Service"如何能判断自身网路没有问题?
|
27天前
|
网络协议 Linux Shell
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
【Azure 应用服务】App Service For Linux 中安装paping, 用于验证从App Service向外请求的网络连通性
|
29天前
|
存储 网络安全 API
【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 
【Azure Service Bus】 Service Bus如何确保消息发送成功,发送端是否有Ack机制 
|
4月前
[UDS] --- DiagnosticSessionControl 0x10 service
[UDS] --- DiagnosticSessionControl 0x10 service
142 0
|
4月前
|
安全
[UDS] --- SecurityAccess 0x27 service
[UDS] --- SecurityAccess 0x27 service
120 0
|
9月前
|
Kubernetes 前端开发 应用服务中间件
service 2 暴露服务的 3种 方式
service 2 暴露服务的 3种 方式
142 0