自学Android开发 Service 的多种启动方式

追求适度,才能走向成功;人在顶峰,迈步就是下坡;身在低谷,抬足既是登高;弦,绷得太紧会断;人,思虑过度会疯;水至清无鱼,人至真无友,山至高无树;适度,不是中庸,而是一种明智的生活态度。

导读:本篇文章讲解 自学Android开发 Service 的多种启动方式,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

目录

一、Service生命周期

二、Service生命周期相关的方法

1、onCreate()

2、onBind(Intent intent)

3、onStartCommand(Intent intent, int flags, int startId)

4、onRebind(Intent intent)

5、onUnbind(Intent intent)

6、stopSelf()

7、stopSelfResult(int startId)

8、onDestroy()

三、直接启动服务

四、直接绑定服务

五、先启动服务,后绑定服务

六、先绑服务,后启动启服务


一、Service生命周期

自学Android开发 Service 的多种启动方式

二、Service生命周期相关的方法

1、onCreate()

        首次创建服务时由系统调用。不要直接调用这个方法。

2、onBind(Intent intent)

        将通信通道返回给服务。如果客户端无法绑定到服务,则可能返回 null。返回 IBinder的通常是使用 aidl 描述的复杂接口。请注意,与其他应用程序组件不同,对此处返回的 IBinder 接口的调用可能不会发生在进程的主线程上。有关主线程的更多信息可以在进程和线程中找到 。

3、onStartCommand(Intent intent, int flags, int startId)

        每次客户端通过调用显式启动服务时由系统调用 Context.startService(Intent),提供它提供的参数和表示启动请求的唯一整数标记。不要直接调用这个方法。
为了向后兼容,默认实现调用 onStart(Intent, int)并返回START_STICKY 或START_STICKY_COMPATIBILIT

        注意:系统在您的服务的主线程上调用它。服务的主线程与在同一进程中运行的活动发生 UI 操作的线程相同。您应该始终避免停止主线程的事件循环。在进行长时间运行的操作、网络调用或大量磁盘 I/O 时,您应该启动一个新线程,或使用异步。

4、onRebind(Intent intent)

        在新客户端连接到服务时调用,之前已通知它所有已在其 onUnbind(Intent). 仅当实现onUnbind(Intent)被覆盖以返回 true时才会调用此方法。

5、onUnbind(Intent intent)

        当所有客户端与服务发布的特定接口断开连接时调用。默认实现不执行任何操作并返回 false。​如果您希望稍后在新客户端绑定到它时调用该服务的方法,则返回 true 。

6、stopSelf()

        停止该服务(如果它之前已启动)。这与调用Context.stopService(Intent)此关闭特定服务相同。

7、stopSelfResult(int startId)

        如果最近一次启动服务,则停止服务 startId. 这与调用Context.stopService(Intent)此特定服务相同,但允许您安全地避免在来自客户端的启动请求时停止,而您尚未在onStart(Intent, int)
请注意对此函数的调用顺序。如果在为之前收到的 ID 调用此函数之前使用最近收到的 ID 调用此函数,则无论如何服务将立即停止。如果您最终可能会乱序处理 ID(例如通过在单独的线程上分派它们),那么按照接收它们的相同顺序停止服务。

8、onDestroy()

        由系统调用以通知服务它不再使用并且正在被删除。服务此时应该清理它持有的所有资源(线程、注册的接收器等)。返回后,将不再调用此 Service 对象,它实际上已死。

三、直接启动服务

1、通过startService()启动服务的过程:

onCreate()  >  onStartCommand()  >  onStart()

        startService() 仅用于启动服务不能绑定客户端。

2、多次调用startService(),服务会多次执行:

onStartCommand()   >  onStart()

3、多次调用startService()后,调用一次stopService()或者stopSelf(int)即可结束服务,多次调用stopService(),只有第一次有用。

        注意:

        一、如果是单一客户端(一般为activity),因为多次调用startService(),也只会产生一个service实例,所以调用一次stopService()或者stopSelf(int)(stopSelf(int) 的参数为 onStartcommand(Intent intent,int flages,int startId) 的 startId )即可结束服务。

        二、如果是多个客户端调用startService()则需要全部客户端调用stopService(),直到最后一个客户端调用调用stopService()service才会调用onDestroy()。

4、调用stopService()的服务结束过程:

> onDestroy()

四、直接绑定服务

1、通过bindService()启动服务的过程:

onCreate()  >  onBind()   >  (onServiceConnected() )

bindService() 用于绑定服务,使Activity与Service进行通信。

        注意:如果没有service实例,将创建实例并启动服务。

2、多次调用bindService(),服务本身不会执行任何调用。

        注意:

        一、系统会缓存 IBinder 服务通信通道。换言之,只有在第一个客户端绑定服务时,系统才会调用服务 onBind() 的方法来生成IBinder。然后,系统会将该IBinder传递至绑定到同一服务的所有其他客户端,无需再次调用onBind()。所以可以通过继承Binder通过方法获取不同的对象。  

        二、多个客户端调用bindService(),同样也需要多次调用unBindService(),直到service没有绑定才会调用unBindService()。

3、调用unBindService()的服务结束过程:

onUnbind ()  >  onDestroy()

        注意:如果服务已启动并接受绑定,那么当系统调用 onUnbind () 方法时,如果想在客户端下一次绑定到服务时接收 onRebind()调用,可以选择返回 true(默认系统返回false)onRebind() 返回空值,但客户端仍会在其 onServiceConnected() 回调中接收IBinder。下图说明了这种生命周期的逻辑。

自学Android开发 Service 的多种启动方式

五、先启动服务,后绑定服务

1、先调用startService(),后调用bindService()。服务的过程为:

onCreate()  >  onStartCommand()  >  onStart()   >  onBind()   > (onServiceConnected() )

2、先unBindService(),后stopService()。服务结束的过程:

onUnbind()   >  onDestroy()

        注意:unBindService()会执行到onUnbind(),stopService()会执行到onDestroy()。

3、先stopService(),后unBindService()。服务结束的过程:

onUnbind()   >  onDestroy()

        注意:stopService()不会执行任何操作,unBindService()会执行到onUnbind()  >  onDestroy()。

六、先绑服务,后启动启服务

1、先调用startService(),后调用bindService()。服务的过程:

onCreate()   >  onBind()   >  (onServiceConnected() )  >  onStartCommand()    >  onStart()

2、先unBindService(),后stopService()。

onUnbind()   >  onDestroy()

3、先stopService(),后unBindService()。服务结束的过程:

onUnbind()   >  onDestroy()

        注意:先stopService()不会执行onDestroy()。后unBindService()才会onUnbind()   >  onDestroy()。所以有绑定须先解绑

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/128372.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!