Android Service详解

藏宝库编辑 2024-9-23 14:54:55 39 0 来自 中国
        Service 对于广大的Android开辟者来说算是耳熟能详了,作为Android的四大组件之一,在我们的开辟中也起着紧张的作用,作为Android开辟,或多或少都知道一些,但是不是每个人把所有知识点都相识的透测。本篇文章对Service的用法做一个总结,从Service的简介,Service的启动方式,Service的生命周期和IntentService四个方面来细说Service,并在文后摆列一些常见的口试题作为思考和回首。
一、Service简介

引用官方界说:
     Service 是一个可以在配景实验长时间运行操纵而不提供用户界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在配景继承运行。 别的,组件可以绑定到服务,以与之进行交互,甚至是实验历程间通讯 (IPC)。 比方,服务可以处置处罚网络事件、播放音乐,实验文件 I/O 或与内容提供步调交互,而所有这统统均可在配景进行。
    Service是一个可以在配景实验长时间操纵而不使用用户界面的应用组件。那么标题来了,既然它不使用用户界面,那么它怎么知道应该什么时间开始实验什么操纵呢?答案是——它可以与其他的引用组件形成一些接洽,从而可以根据其传来的信息在符合的时间实验符合的操纵。
二、Service的启动方式

    Service的启动方式紧张有两种,分别是startService和bindService。此中,startService使用的是同一个Service,因此onStart()会实验多次,onCreate()只实验一次,onStartCommand()也会实验多次。使用bindService启动时,onCreate()与onBind()都只会调用一次。
使用startService启动时是单独开一个服务,与Activity没有任何关系,而bindService方式启动时,Service会和Activity进行绑定,当对应的activity烧毁时,对应的Service也会烧毁。
三、Service的生命周期

下图是startService和bindService两种方式启动Service的表示图:
1、startService
onCreate():如果service没被创建过,调用startService()后会实验onCreate()回调;如果service已处于运行中,调用startService()不会实验onCreate()方法。
onStartCommand():多次实验了Context的startService()方法,那么Service的
onStartCommand()方法也会相应的多次调用。
onBind():Service中的onBind()方法是抽象方法,Service类自己就是抽象类,以是onBind()方法是必须重写的,纵然我们用不到。
onDestory():在烧毁Service的时间该方法。
2、bindService
启动的服务和调用者之间是典范的Client-Server模式。调用者是client,Service则是Server端。Service只有一个,但绑定到Service上面的Client可以有一个或许多个。bindService启动服务的生命周期与其绑定的client痛痒相关。
1)起首,在Service的onBind()方法中返回IBinder范例的实例。
2)onBInd()方法返回的IBinder的实例必要可以或许返回Service实例自己
3、.Service 的 onStartCommand 方法返回值所代表的含义
1)START_NOT_STICKY
在实验完 onStartCommand 后,服务被非常 kill 掉,体系不会自动重启该服务。
2)START_STICKY
重传 Intent。使用这个返回值时,如果在实验完 onStartCommand 后,服务被异 常 kill 掉,体系会自动重启该服务 ,而且onStartCommand方法会实验,onStartCommand方法中的intent值为null。实用于媒体播放器或类似服务。
3)START_REDELIVER_INTEN
使用这个返回值时,服务被异 常 kill 掉,体系会自动重启该服务,并将 Intent 的值传入。实用于自动实验应该立刻规复的作业(比方下载文件)的服务。
四、IntentService

1、IntentService 是 Service 的子类,默认开启了一个工作线程HandlerThread,使用这个工作线程逐一处置处罚所有启动哀求,在任务实验完毕后会自动克制服务。只要实现一个方法 onHandleIntent,该方法会吸收每个启动哀求的 Intent,可以或许实验配景工作和耗时操纵。可以启动IntentService 多次,而每一个耗时操纵会以队列的方式在 IntentService 的 onHandlerIntent回调方法中实验,而且,每一次只会实验一个工作线程,实验完第一个再实验第二个。而且期待所有消息都实验完后才克制服务。
2、IntentService原理
1)创建一个名叫 ServiceHandler 的内部 Handler
2)把内部Handler与HandlerThread所对应的子线程进行绑定
3)HandlerThread开启线程 创建自己的looper
4)通过 onStartCommand() intent,依次插入到工作队列中,并发送给 onHandleIntent()逐个处置处罚可以用作配景下载任务 静默上传
3、与Service的区别
IntentService会创建独立的worker线程来处置处罚所有的Intent哀求 Service主线程不能处置处罚耗时操纵,IntentService不会壅闭UI线程,而平常Serveice会导致ANR非常。为Service的onBind()提供默认实现,返回null;onStartCommand提供默认实现,将哀求Intent添加到队列中。所有哀求处置处罚完成后,IntentService会自动克制,无需调用stopSelf()方法克制Service。
五、常晤口试题

1、 Service的两种启动方式有何区别?
2、怎样包管Service不被杀死?
3、Service 和 IntentService 的区别?
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2024-10-18 19:26, Processed in 0.155547 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表