`

Android之service理论

 
阅读更多

一:什么是Service

     服务是运行在后台的一段代码。它可以运行在它自己的进程,也可以运行在其他应用程序进程的上下文(context)里面,这取决于自身的需要。其它的组件可以绑定到一个服务(Service)上面,通过远程过程调用(RPC)来调用这个方法。例如媒体播放器的服务,当用户退出媒体选择用户界面,仍然希望音乐依然可以继续播放,这时就是由服务 (service)来保证当用户界面关闭时音乐继续播放的。

     它跟Activity的级别差不多,但是他不能自己运行,需要通过某一个Activity或者其他Context对象来调用, Context.startService() 和Context.bindService()。

      两种启动Service的方式有所不同。这里要说明一下的是如果你在Service的onCreate或者onStart做一些很耗时间的事情,最好在Service里启动一个线程来完成,因为Service是跑在主线程中,会影响到你的UI操作或者阻塞主线程中的其他事情。

      什么时候需要Service呢?比如播放多媒体的时候用户启动了其他Activity这个时候程序要在后台继续播放,比如检测SD卡上文件的变化,再或者在后台记录你地理信息位置的改变等等。

二:如何使用Service

    1.第一种是通过调用Context.startService()启动,调用Context.stopService()结束,startService()可以传递参数给Service。
    2.第二种方式是通过调用Context.bindService()启动,调用Context.unbindservice()结束,还可以通过ServiceConnection访问Service。
    二者可以混合使用,比如说我可以先startService再bindservice。
三:service生命周期

onCreate() 创建Service
onStart(Intent intent, int startId) 启动Service
onDestroy() 销毁Service
onBind() 返回一个IBinder接口对象给Service

    startService后,即使调用startService的进程结束了,Service仍然还存在,直到有进程调用stopService,或者Service自己自杀(stopSelf())。bindService后,Service就和调用bindService的进程同生共死了,也就是说当调用bindService的进程死了,那么它bind的Service也要跟着被结束,当然期间也可以调用unbindservice让 Service结束。

    两种方式混合使用时,如果先是绑定(bind)了,那么启动(start)的时候就直接运行Service的onStrat方法,如果先是启动(start),那么绑定(bind)的时候就直接运行onBind的方法。如果你先绑定(bind)上了,就暂停(stop)不掉了,也就是stopService不能用了,只能先UnbindService,再StopService.所以是先启动(start)还是先绑定(bind)行为时由区别的。比如说你startService了,我bindService了,那么只有你stopService了而且也unbindservice了,这个Service才会被结束。

     Android系统将会尝试保留那些启动了的或者是绑定了服务的进程。如果该服务正在进程的onCreate(), onStart(), 或者 onDestroy() 这些方法中执行时, 那么主进程将会成为一个前台进程,以确保此代码不会被停止。如果服务已经开始,那么它的主进程会就重要性而言低于所有可见的进程但高于不可见的进程, 由于只有少数几个进程是用户可见的,所以只要不是内存特别低,该服务不会停止.。如果有多个客户端绑定了服务, 只要客户端中的一个对于用户是可见的,即认为该服务可见。

    如果Service还没有运行,则android先调用onCreate()然后调用onStart();如果Service已经运行,则只调用onStart(),所以一个Service的onStart方法可能会重复调用多次。

    stopService的时候直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行。该Service的调用者再启动起来后可以通过stopService关闭Service。

   所以调用startService的生命周期为:onCreate --> onStart(可多次调用) --> onDestroy

   使用context.bindService()启动Service会经历:

context.bindService()->onCreate()->onBind()->Service running

onUnbind() -> onDestroy() ->Service stop

    onBind将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service运行的状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起,Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。

    所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。

    所以,在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。

四:启动和停止Service
    ①启动:startService(Intent intent)来启动Service,这时Service会调用自身的onCreate()方法(该Service未创建),接着调用onStart()方法。
    ②停止:stopService(Intent intent)来停止Service,这时Service会调用自身的onDestory()方法。

五:绑定Service
    调用bindService(Intent service, ServiceConnection conn, int flags)来绑定一个Service,这时Service会调用自身的onCreate()方法(该Service未创建),接着调用onBind()方法返回客户端一个IBinder接口对象。(注意:如果返回null,ServiceConnection对象的方法将不会被调用)
    参数①service:Intent对象 。
    参数②conn:ServiceConnection对象,实现其onServiceConnected()和onServiceDisconnected()在连接成功和断开连接时处理。
    参数③flags:Service创建的方式,一般用Service.BIND_AUTO_CREATE表示绑定时自动创建。

分享到:
评论

相关推荐

    android 免Root屏蔽home键,通过AccessibilityService,屏蔽按键。打王者防误触

    在Android系统中,Home键是用户最常用的导航键之一,用于快速返回主屏幕。然而,在特定的应用场景下,比如玩游戏时,尤其是像“王者荣耀”这样的竞技游戏,误触Home键可能会导致游戏进程中断,影响玩家体验。为了...

    通过Messenger实现Android Service更新UI

    在Android应用开发中,Service是一种在后台运行的组件,它不具有用户界面,但可以执行长时间的任务或与其他组件进行通信。在某些情况下,我们可能需要一个Service去执行一些任务,并在任务完成后更新UI。这时,我们...

    android 各种服务service练习

    在Android开发中,服务(Service)是四大组件之一,它在后台执行长时间运行的操作而无需与用户交互。本练习旨在帮助初学者深入理解和熟练运用Android中的各种服务类型及其使用场景。我们将通过一个示例项目来探讨...

    Android学习之路——7.Service

    在Android应用开发中,Service是四大组件之一,它在后台执行长时间运行的操作,不与用户交互。本篇文章将深入探讨“Android学习之路——7.Service”,分析Service的基本概念、使用方式以及常见应用场景,同时结合...

    王家林的Android软硬整合设计与框架揭秘: HAL&Framework; &Native; Service &App;&Browser;架构设计与实战开发

    《王家林的Android软硬...总的来说,该课程是一次全方位的Android技术探索之旅,不仅传授技术知识,更注重培养学员的设计思维和商业哲学,对于想要在Android领域深化发展的专业人士来说,是一次不可多得的学习机会。

    Android客户端访问Web Service的实现.pdf

    最后,文档列出了参考文献,这些文献可为深入研究和应用Web Service在Android客户端的实现提供更进一步的理论支持和技术参考。 综上所述,Android客户端访问Web Service的实现涉及对Android平台的了解,Web Service...

    程序结构设计理论(Android版)_20191108.zip

    本文包含一个109页的PPT讲述Android程序结构设计的理论和方法,附带一个项目案例ProgramStructureGPS.20190922.zip; 其中的内容有: Android app的界面的树结构与对界面的访问; Activity和Activity通信的方法 ...

    android-framework-Android系统原理与开发

    - **AndroidService**:指的是运行在System Server进程中的系统服务,例如Activity Manager Service、Package Manager Service等。这些服务为整个系统提供了关键功能,是构建在Dalvik VM之上的组件,通过JNI调用底层...

    AIDL_AidlService_android_

    通过分析这些代码,我们可以看到如何实际应用上述理论,实现客户端和服务端的通信。 总的来说,AIDL是Android平台中进行进程间通信的关键技术,理解并熟练使用AIDL,能够帮助开发者构建更加健壮和高效的Android应用...

    想到做到-Android开发关键技术与精彩案例

    5. **服务(Service)**:服务是Android中用于执行长时间运行操作而不提供用户界面的组件。开发者需要了解如何创建、控制和管理后台服务。 6. **广播接收器(BroadcastReceiver)**:广播接收器用于响应系统发出的广播...

    《Android手机软件开发》说课PPT课件

    【Android手机软件开发】课程是针对计算机应用技术专业的高职2011软件班设计的专业课程,总学时为64学时,分为理论和实践两部分。本课程旨在使学生熟练掌握Android开发所需的基本理论和技术,包括Java语言基础、...

    Android代码压缩包下

    2. **Android之Service**: Service是Android系统中的一个关键组件,用于在后台执行长时间运行的任务,不与用户界面直接交互。刘老师的这部分源码可能涉及到创建自定义服务,处理音频播放、数据同步、定时任务等场景...

    android经典书籍-Professional Android 4 Application Development【pdf+代码】

    《Professional Android 4 Application Development》是一本针对Android应用开发的专业指南,由Rob Miles撰写,是Android开发者中的经典之作。这本书全面覆盖了Android 4(Ice Cream Sandwich)版本的应用开发技术,...

    Android studio结课大作业

    **Android Studio 结课大作业详解** Android Studio 是Google推出...在实际操作中不断探索和实践,将理论知识与实际相结合,是成为一名优秀Android开发者的关键步骤。希望这份资料能够对你的学习之路提供有力的支持!

    android驾照考试系统

    "Android驾照考试系统"是一款专为驾驶学习者设计的应用程序,它涵盖了驾照理论考试的核心功能,旨在帮助用户高效备考。该系统通常会包括以下几个主要功能模块: 1. 题库练习:系统会包含全国统一的驾驶理论考试题库...

    Android平台开发之旅源码

    《Android平台开发之旅》这本书通过深入浅出的方式,带领开发者探索Android的世界。本压缩包"Android平台开发之旅源码.zip"包含了书中各个章节所涉及的示例代码,帮助读者更好地理解和实践书中的知识点。 1. **...

    Android小项目集合100多个

    "Android小项目集合100多个"涵盖了以上知识点的实践应用,通过这些项目,开发者可以深入学习每个概念,并将理论知识转化为实际操作,从而在Android开发道路上更进一步。每个项目都是一个独立的模块,涵盖不同的功能...

    Android底层开发实战_Android底层开发实战_android_android开发实战_

    4. **Android系统服务**:分析系统服务如Activity Manager、Power Manager、Battery Service等,它们是如何管理设备状态和用户交互的。 5. **JNI(Java Native Interface)**:学习如何使用JNI在Java代码和C/C++...

    Android开发从入门到精通_android_

    开发者主要在应用框架层和应用层工作,通过Java或Kotlin语言编写代码,利用Activity、Service、BroadcastReceiver、ContentProvider等组件进行功能实现。 Android Studio的安装和配置是学习的第一步。下载最新版本...

    安卓期末大作业Android寻味之旅App源码.zip

    总之,"Android寻味之旅App源码"是一个宝贵的教育资源,对于想要学习Android开发的学生来说,它可以作为实践操作的实例,帮助他们巩固理论知识,提升动手能力。通过分析和修改这个源码,学生能够更深入地理解Android...

Global site tag (gtag.js) - Google Analytics