`
XiangdongLee
  • 浏览: 90776 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

【攻克Android (27)】四大组件之 Service

 
阅读更多
一、Service

        1. 概念

        Service是Android系统的后台服务组件,适用于开发无界面、长时间运行的应用功能。例如音乐播放等。

        Android中的服务和windows中的服务是类似的东西,服务一般没有用户操作界面,它运行于系统中不容易被用户发觉,可以使用它开发如监控之类的程序。


        2. 特点

        (1)没有用户界面,有利于降低系统资源消耗。

        (2)比Activity 的优先级高,不会轻易被Android系统终止。

        (3)即使Service被系统终止,在系统资源恢复后Service也将自动恢复运行状态。

        (4)用于进程间通信(Inter Process Communication,IPC),
解决两个不同Android应用程序进程之间的调用和通讯问题。



        3. Service生命周期及其回调函数



        3.1 Service使用方式

        服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。

        (1)启动方式

        通过调用Context.startService()启动Service,通过调用Context.stopService()或Service.stopSelf()停止Service。

        Service是由其他的组件启动的,但停止过程可以通过其他组件或自身完成。

        如果仅以启动方式使用的Service,这个Service需要具备自管理的能力,且不需要通过函数调用向外部组件提供数据或功能。

        (2)绑定方式

        使用Service的组件通过Context.bindService()建立服务链接,通过Context.unbindService()停止服务链接。

        通过bindService()函数绑定Servcie时, onCreate()函数和onBinde()函数将先后被调用。

        通过unbindService()函数取消绑定Servcie时,onUnbind()函数将被调用,如果onUnbind()函数的返回true,则表示在调用者绑定新服务时,onRebind()函数将被调用。

        (3)两种方式的区别

        这两个方法都可以启动Service,但是它们的使用场合有所不同。

        使用startService()方法启用服务,调用者与服务之间没有关联,即使调用者退出了,服务仍然运行。

        使用bindService()方法启用服务,调用者与服务绑定在了一起,
调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的特点。


        3.2 Service生命周期回调方法

        (1)启动方式中的回调方法

        onCreate()、onStartCommand()、onDestroy()

        onCreate()方法在服务被创建时调用,该方法只会被调用一次,
无论调用多少次startService()或bindService()方法,服务也只被创建一次。


        onStartCommand() 只有采用Context.startService()方法启动服务时才会回调该方法。该方法在服务开始运行时被调用。多次调用startService()方法尽管不会多次创建服务,但onStartCommand() 方法会被多次调用。

        onDestroy()方法在服务被终止时调用。

        (2)绑定方式中的回调方法

        onCreate()、onBind()、onUnbind()、onDestroy()

        onCreate()方法在服务被创建时调用,该方法只会被调用一次,
无论调用多少次startService()或bindService()方法,服务也只被创建一次。


        onBind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务绑定时被调用,当调用者与服务已经绑定,多次调用Context.bindService()方法并不会导致该方法被多次调用。

        onUnbind()只有采用Context.bindService()方法启动服务时才会回调该方法。该方法在调用者与服务解除绑定时被调用。

        onDestroy()方法在服务被终止时调用。

        3.3 启动方式和绑定方式的结合

        (1)如果先采用startService()方法启动服务,然后调用bindService()方法绑定到服务,再调用unbindService()方法解除绑定,最后调用bindService()方法再次绑定到服务,触发的生命周期方法如下

        onCreate()onStart()onBind()onUnbind()[重载后的方法需返回true]onRebind()

        (2)结合的例子:

        以MP3播放器为例,在后台的工作的Service通过Context.startService()启动某个特定音乐播放,但在播放过程中如果用户需要暂停音乐播放,则需要通过Context.bindService()获取服务链接和Service对象,进而通过调用Service的对象中的函数,暂停音乐播放过程,并保存相关信息。在这种情况下,如果调用Context.stopService()并不能够停止Service,需要在所有的服务链接关闭后,Service才能够真正的停止。


        4. Service两种启动方式

        (1)显式启动

        在Intent中指明Service所在的类,并调用startService(Intent)函数启动Service。

        (2)隐式启动

        在注册Service时,声明Intent-filter的action属性。设置Intent的action属性,可以在不声明Service所在类的情况下启动服务。

        (3)两种方式比较

        若Service和调用服务的组件在同一个应用程序中,可以使用显式启动或隐式启动,显式启动更加易于使用,且代码简洁。

        若服务和调用服务的组件在不同的应用程序中,则只能使用隐式启动。


        5. Service的开发

        服务的开发比较简单,如下:

        第一步:继承Service类

public class SMSService extends Service { }


        第二步:在AndroidManifest.xml文件中的<application>节点里对服务进行注册(不注册的话,这个Service根本无法启动):

<service android:name=".SMSService" />


        使用<service>标签声明服务,其中的android:name表示的是Service的类名称,一定要与用户建立的Service类名称一致。


        当在Android Studio中创建Service的时候,以上两步自动完成了。


        6. Service分类

        (1)本地服务与远程服务

        Service分为本地服务(Local Service)和远程服务(Remote Service)。

        1)本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源。另外,本地服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。主进程被Kill后,服务便会终止。

        2)远程服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务,具有较高的灵活性。该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。

        (2)按使用方式分为以下三种:

        1)startService 启动的服务:主要用于启动一个服务执行后台任务,不进行通信。适用于服务和Activity之间没有调用交互的情况。停止服务使用stopService。

        2)bindService 启动的服务:该方法启动的服务可以进行通信。适用于服务和Activity相互之间需要方法调用或者传递参数。停止服务使用unbindService;

        3)startService 同时也 bindService 启动的服务:停止服务应同时使用unbindService与stopService。
1
2
分享到:
评论

相关推荐

    Winform自定义组件库

    资源为Winform用户自定义组件库,是自己平时做项目用到的组件以及参考晚上那些有特效组件封装的组件库,中间付出了很多努力,攻克了很多难点,大家喜欢的话,请大家多多给予鼓励,目前是V1.0版本,后期不断更新。...

    攻克Data动态获取网页评论,保存数据库

    【攻克Data动态获取网页评论,保存数据库】是一个关于利用特定工具——攻克Data,来抓取网页上的评论数据并存储到数据库的过程。这个过程涉及到网络爬虫技术、JSON解析以及数据库管理等多个IT领域的知识点。 1. **...

    100G传输商用化需攻克四大技术.pdf

    标题:“100G传输商用化需攻克四大技术.pdf” 描述:“光通信最重要的特点就是具有几乎用不尽的带宽资源。随着信息社会的发展,人们对信息服务的需求量与日俱增。100GbpsWDM系统是一个重要方向。超宽带时代,承载网...

    四大编码全攻克 高清硬解码设置宝典 完美解码

    在IT领域,尤其是多媒体播放和视频处理中,"四大编码全攻克 高清硬解码设置宝典"是一个关于理解和优化视频解码的关键主题。这里的"四大编码"通常指的是目前主流的视频编码格式:H.264、HEVC(High Efficiency Video ...

    大学生攻克Linux系统教程

    在开始Linux的学习之旅前,首先需要了解如何安装Linux操作系统。常见的Linux发行版有Ubuntu、Fedora、Debian等,本教程将详细解释如何下载ISO镜像文件,创建启动U盘,以及通过BIOS设置进行安装过程。同时,还会讲解...

    Android开心词场app

    - **Android四大组件**:Activity、Service、BroadcastReceiver和ContentProvider,这些组件构成了Android应用的基础结构,开发者需要熟练掌握它们之间的交互逻辑。 - **UI设计**:采用Material Design设计风格,...

    如何深入学习Android Framework.pdf

    在当今移动互联网时代,Android作为全球最大的移动操作系统之一,其重要性不言而喻。对于开发者而言,深入理解Android Framework不仅能够提升自身的技术水平,还能在求职市场中获得竞争优势。尤其是在高级职位的面试...

    Android应用源码之Fanfoudroid(饭否网开源项目)-IT计算机-毕业设计.zip

    “Fanfoudroid”展示了如何利用Android的布局组件、自定义View以及动画效果来构建美观且响应迅速的界面。例如,滑动刷新、下拉加载更多、时间线布局等常见功能的实现,都可以从源码中找到答案。 论文写作是毕业设计...

    Android自动来电录音

    在Android平台上实现自动来电录音是一项技术挑战,但并非无法攻克。Android系统提供了丰富的API和工具,使得开发者可以创建各种功能丰富的应用,包括来电录音。在本文中,我们将深入探讨如何利用Android的...

    24学时攻克c++

    根据提供的信息,“24学时攻克C++”这本书旨在通过一系列高效的学习计划帮助读者在较短的时间内掌握C++编程语言。尽管仅上传了23页的内容,我们仍然可以从书名、描述以及部分可见的内容中推断出一些关键知识点。 ##...

    24小时攻克c++代码

    《24小时攻克C++代码》是一门针对C++编程语言深入浅出的学习教程,旨在帮助初学者在短时间内掌握C++编程基础,并逐步提升至进阶水平。C++是一种广泛应用的面向对象编程语言,它的强大功能和高效性能使得它在系统软件...

    新东方8天攻克8000单词魔鬼训练营

    标题中的“新东方8天攻克8000单词魔鬼训练营”揭示了一个高效学习英语单词的课程项目。新东方作为知名的教育机构,以其在英语教学领域的专业性而著称,这个训练营可能是一个针对英语学习者设计的高强度、短期记忆...

    Flash Development for Android Cookbook

    - **核心概念理解:** 掌握Activity、Intent、Service、Broadcast Receiver等基本组件的概念对于Android开发至关重要。这些组件构成了Android应用的基本结构。 **5. 使用Flash、Flex与AIR开发Android应用** - **...

    大学生攻克Linux系统教程.rar

    大学生攻克Linux系统教程(又名天下没有难学的Linux)。一位在校大学生整理的教程,献给每一位要征服Linux的学习者-五星级的Linux教程。 本书汇集众多Linux学习者的心血与贡献,有很多作者在默默的为你呼喊,感谢...

    8天攻克8000英语词汇

    8天攻克8000词汇,word版,方便学习,背单词的好东东

    24学时攻克c++_笔记

    函数是C++编程的基本构建块之一,它们允许代码复用和模块化。函数声明通常放在`.h`头文件中,而函数定义则放在`.cpp`文件中。理解函数参数的传值和传址机制对于避免常见的编程陷阱至关重要。另外,遵循良好的代码...

    24学时攻克C++源码及习题答案

    在学习编程语言C++的过程中,24学时的课程安排是一个相当常见的学习进度,这个压缩包文件名为"24学时攻克C++源码及习题答案",显然是为初学者设计的一套完整教程。C++是面向对象编程的重要语言,它的强大功能和广泛...

    大学生攻克Linux系统教程(又名天下没有难学的Linux)

    Linux系统是全球最广泛使用的开源操作系统之一,尤其在服务器领域占据主导地位。对于大学生来说,掌握Linux技术不仅可以提升就业竞争力,还能为深入学习其他IT技术,如Java编程、SSH框架等奠定坚实基础。本教程...

Global site tag (gtag.js) - Google Analytics