Service解析

Service的startService与bindService的区别,以及service与Thread的区别

(1)  以startService方式启动Service,启动后的Service与Activity没有联系

(2)以bindService方式启动Service,作用是将Activity与Service捆绑在一起,“同生共死”,当Activity被销毁时Service也被销毁,如果service和访问者之间需要进行方法调用或数据交换,则应使用bindservice的方式启动service以unbindservice的方式关闭service.

bindservice(Intent service,ServiceConnection conn,int flag)

service:该参数通过Intent指定要启动的service

conn:

1:当访问者与service之间连接成功后,IBinder onBind(Intent intent)函数会回调ServiceConnection对象的  

onServiceConnected(ComponentName name, IBinder service)方法。

并且onBind(Intent intent)函数会返回一个IBinder对象给onServiceConnected(ComponentName name,IBinder

service)函数的service 。返回的IBinder对象可看成是该service组件的代理对象,service允许客户端通过IBinder

对访问service内部数据,这样便实现客户端和service之间的通讯。

2:当service所在的宿主进程由于异常或其他原因终止时,则调用onServiceDisconnected(ComponentName name) 方法

flag:指定绑定时是否主动创建service,参数为0不自动创建,参数为Bind_AUTO_CREATE自动创建

2:service与Thread的区别

service虽然运行在后台没有用户界面,但service是运行在主线程中的,可通过Thread.currentThread().getId()查看当前线程的ID号。截图如下:

则在service中处理耗时操作依然会出现ANR异常,那该如何解决这个问题呢?可在service中开启一个线程去处理耗时任务。

插曲:

后台和子线程是两个不同的概念,android的后台就是指它的运行完全不依赖UI界面,即使Activity被销毁,或者程序被关闭,只要进程还在,service就可以继续运行。

既然在service里也要创建线程,那为何不直接在Activity中创建呢?原因是Activity很难对Thread控制,当Activity被销毁后,就没有方法重新获取之间创建的子线程实例。而且在一个Activity创建的子线程,另外的Activity无法对其操作。

但service不同,所有的Activity都可与service关联,然后就可以很方便的操作其中的方法,即使Activity被销毁,只要重新连接就可以获取原有service中的Binder实例,因此使用service处理后台服务,Activity就可以放心的finish,而不用担心无法对后台服务进行控制的情况。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值