浅谈Service

     start方式启动服务:

         生命周期:onCreate()-->onStartCommand()-->onDestory()    

         特点:开启服务后服务与开启者无关,开启者不可以调用服务的方法

     bind方式启动服务:

         生命周期:onCreate()--》onBind()--》onUnBind()--》onDestory()

          特点:开启服务后,服务与开启者同生共死 ,而且开启者还可以调用服务里的方法

   

无论通过那种方式启动 Service(start、bind、start & bind),任何组件(甚至其他应用的组件)都可以使用 Service。并通过 Intent 传递参数。当然,你也可以将 Service 在 AndroidMenifest.xml 文件中配置成私有的,不允许其他应用访问。
android:exported 属性设为 false,表示不允许其他应用程序启动本应用的组件,即便是显式 Intent 也不行(even when using an explicit intent)。

Service 的 onCreate() 可以执行耗时操作吗?

   不可以 ,因为四大组件是运行在主线程的。所以不能进行耗时操作。

 

那么在Service中如何执行耗时操作?

       第一想法肯定是new Thread(),还可以使用 AysncTask 或 HandlerThread 来替代 Thread 创建线程。

还有一种有意思的方式就是IntentService。

   IntentService继承service。

 

 

IntentService 继承于 Service,若 Service 不需要同时处理多个请求,那么使用 IntentService 将是最好选择。你只需要重写 onHandleIntent() 方法,该方法接收一个回调的 Intent 参数,你可以在方法内进行耗时操作,因为它默认开启了一个子线程,操作执行完成后也无需手动调用 stopSelf() 方法,onHandleIntent() 将会自动调用该方法。

使用 IntentService 的要点如下:

  • 默认在子线程中处理回传到 onStartCommand() 方法中的 Intent;
  • 在重写的 onHandleIntent() 方法中处理按时间排序的 Intent 队列,所以不用担心多线程(multi-threading)带来的问题。
  • 当所有请求处理完成后,自动停止 Service,无需手动调用 stopSelf() 方法;
  • 默认实现了 onBind() 方法,并返回 null;
  • 默认实现了 onStartCommand() 方法,并将回传的 Intent 以序列的形式发送给 onHandleIntent(),您只需重写该方法并处理 Intent 即可。

在Handler中我们处理完每一个命令都会调用stopSelf(int)方法来停止服务:该方法需要来自onStartCommand方法中的启动ID,只有在接收到最新的启动ID时才会停止服务,就是说,我们的IntentService直到命令队列中的所有命令被执行完后才会停止服务。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值