Service、IntentService

Service

简述:

  Service是四大应用组件(application component )之一,主要实现一个长时间运行且不需要与用户交互的程序,或者提供功能给其他应用来使用。和其他组件一样,每个Service需要在 AndroidManifest.xml中有对应的 < service > 标签声明。 Service 可以使用 Context.startService() 或 Context.bindService()启动。
  Service在所属进程的主线程中运行。 这意味着如果你的Service打算运行占CPU或者可能产生阻塞的运算,它需要创建它的子线程来进行运算。IntentService类是可以已经实现的有自己子线程的Service类。

例子:

  在一个MP3播放器的应用中,可能会有多个Activity让用户可以选择歌曲并播放歌曲,用户会认为不论在哪个活动下音乐都应该持续播放。在这个例子中,MP3播放器的活动会使用 Context.startService() 来启动一个service,从而可以在后台保持音乐的播放,直到这个 service 运行结束。
  另外,还可以通过 Context.bindService() 方法,使Activity连接到一个服务上(如果服务还没有运行则将启动它)。当连接到一个服务之后,我们可以通过Service提供的接口与之进行通讯。如MP3播放器中,我们还需要进行暂停等操作。

正常使用,通过直接方法调用:

  1. 告诉系统在后台处理某些任务(注意默认还是在主线程下完成的)
    定义在Context类中启动和停止服务的函数:
     Context.startService(startIntent)
     Context.stopService(stopIntent);
  2. 应用公开出自己功能给其他应用的特性
     Context.bindService() 可以与Service进行通信,指挥服务。

特殊使用:

  使用AIDL提供远程接口,以实现跨进程调用Service。

生命周期

  和Activity相似,Service 也有生命周期函数。
- 使用Context.startService()方法启动:
 Context.startService()->onCreate()-> onSartCommand() ->启动
 Context.stopService() or stopSelf() ->onDestroy() ->停止
  如果Service已经运行,则只调用onSartCommand()
- 使用Context.bindService()方法启动:
 Context.bindService()->onCreate()->onBind()->启动
 onUnbind() -> onDestroy() –>停止
  使用者会接受到从onBind(Intent)方法返回的IBinder对象,从而使用者可以回调Service中的方法。

活动和服务进行通信 :

  在Service中创建Binder的子类,在其中实现需要的功能。
  通过onBind()方法 将其实例返回。
  在Acitivity中绑定服务,使用ServiceConnection的实例,重写onServiceConnected() onServiceDisconnected()方法,绑定时会调用其方法。

前台服务:

  会一直有一个正在运行的图标在系统的状态栏显示。
  在Service中调用startForeground();方法,并传入Notification对象。


IntentService

简述:

  IntentService类也许是最常用的Service类了。它是专门用来处理异步请求的。
  用户通过startService(Intent)函数发送请求(也就是Intent对象),IntentService随之启动,并在worker thread中处理每一条请求,完成所有请求后自动停止。

正常使用:

  继承IntentService类,实现onHandleIntent(Intent)方法,在方法中实现对请求的处理。

工作流程:

IntentService
  接收到首个命令时, IntentService即完成启动,并触发一个后台线程,然后将命令放入队列。
  随后, IntentService继续按顺序执行每一条命令,并同时为每一条命令在后台线程上调用onHandleIntent(Intent)方法。新进命令总是放置在队列尾部。最后,执行完队列中全部命令后,服务也随即停止并被销毁。


  实际应用中,可以使用Service、AlarmManager、PendingIntent结合实现在后台长期执行定时任务的服务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值