转载请表明出处:http://blog.csdn.net/u012637501(嵌入式_小J的天空)
一、Service
1.Service简单介绍
    Service为Android四大组件之中的一个。Service与Activity组件相似,都代表可执行的程序且有自己的生命周期,唯一的差别是Activity组件提供界面方便人机交互而Service仅仅在后台执行且没有交互界面。Service是android
系统中的一种组件,它们都是从Context派生出来的,可是它不能自己执行,仅仅能在后台执行。而且能够和其它组件进行交互。

它须要通过某一个Activity或者其它Context对象来调用。

须要注意的是,Service不是一个单独的进程或为了防止应用出现无反应错误单独的线程,它像其它应用对象一样执行在其托管进程的主线程中。

当然,假设我们希望自己的Service能够在后台执行MP3或者网络下载,我们能够创建一个线程来实现。

2.Service的生命周期

因为Service可由两种方式启动:Context.startService()和Context.bindService().
(1)Context.startService()方法:通过该方法启动Service,訪问者(client)与Service之间没有关联,即使訪问者退出了,Service仍然执行。

调用Context.startService()触发的Service生命周期方法:

 onCreate()->onStartCommand(Intent, int, int) ->Service执行->
Context.stopService()或 stopSelf()->onDestory()->Service被关闭
(2)Context.bindService()方法:通过该方法启动Service。訪问者(client)与Service绑定在一起,訪问者一旦退出,Service也就终止了。

调用Context.startService()触发的Service生命周期方法:

 onCreate()->OnBind(Intent)->client绑定到Service->OnUnbind()->onDestory()->Service被关闭

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMjYzNzUwMQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" width="340" height="415" alt="" style="background-color:inherit; display:inline-block; margin-top:8px; width:340.12476007677543px; height:415px">


升华笔记1:
1.当调用Context.bindService()方法启动一个Service时。不会运行onStartCommand(Intent,
int, int)方法;
2.当Activity(client的Activiy)调用BindService()绑定一个已启动的Service(Activity起初通过startService()方法启动)时,系统仅仅是把Service内部IBinder对象(由onBind()方法返回)传递给Acitvity,并不会把该Service生命周期全然"绑定"到该Activity,因而当Activity调用unBindService()方法取消与该Service的绑定时,也仅仅是切断该Activity与Service之间的关联,并不能停止该Service组件。

3.API-Service

public abstract class Service
(1)继承关系
java.lang.Object 
   ↳ android.content.Context
     ↳ android.content.ContextWrapper
       ↳ android.app.Service
(2)构造方法
    Service()
可是。一般我们在开发Service时主要是通过Content.getService()方法来获取Service类对象。
(3)经常用法(Service组件方法)
>void
OnCreate():当该Service第一次被创建后将马上被调用。
>public
int onStartCommand(Intent intent, int flags, int startId):每次client调用startService(Intent intent)方法启动该Service时都会回调该方法。
>public
abstract boolean stopService (Intent service):client调用该方法关闭Service
>public
final void stopSelf ():Service自己主动关闭
>public
abstract IBinder onBind (Intent intent):该方法是Service子类必须实现的方法,其返回一个IBinder对象,client应用程序可通过该对象与Service组件通信。參数Intent对象用于将client绑定到Service,传递给Context.bindService。
>boolean
onUnbind(Intent intent):当该Service上绑定的全部client都断开链接时将会调用该方法
>void
onDestory():当该Service被关闭之前将会调用该方法。Service将会清理其占有的全部资源(包含全部线程、注冊在Service上的接受者)。
4.Service的启动方式
(1)Context.startService()启动
    当client(组件)通过Context的startService()启动Service后,訪问者与Service之间没有关联,该Service将一直在后台运行。即使调用startService的进程结束了,Service仍然还存在,直到有进程调用stopService(),或者Service自己自杀(stopSelf()).在这样的情况下,Service与訪问者之间无法进行通信、数据交换。
(2)Context.bindService()启动
    通过Context的bindService()绑定Service后,Servcice就和调用bindService()的组件同生共死了。

也就是说当调用bindService()的组件销毁了,那么它绑定的Service也跟着被结束。

二、开发Service基本思路(本地)
1.创建、配置Service
(1)定义一个继承于Service的子类,假设希望Service组件完毕某些事情,我们仅仅要在onCreate()或onStartCommand()方法中定义相关的业务代码就可以。

一个Service组件的框架例如以下:
\src\service\FirstService.java
  1. public class FirstService extends Service
  2. {
  3. /*a.必须实现的方法,返回一个IBinder对象给client以便实现通信
  4. * 因为我们调用startService方法启动一个Servie,无需与client(组件)绑定,因此,返回为null.
  5. */
  6. @Override
  7. public IBinder onBind(Intent arg0)
  8. {
  9. return null;
  10. }
  11. /*b.Service被创建时回调该方法*/
  12. @Override
  13. public void onCreate()
  14. {
  15. super.onCreate();
  16. System.out.println("Service is Created");
  17. }
  18. /*c.Service被启动时回调该方法*/
  19. @Override
  20. public int onStartCommand(Intent intent,int flags,int startId)
  21. {
  22. Sytem.out.println("Service is Started");
  23. return START_STICKY;
  24. }
  25. /*d.Service被关闭之前回调*/
  26. @Override
  27. public void onDestroy()
  28. {
  29. super.onDestroy();
  30. System.out.println("Service is Destroyed");
  31. }
  32. }

2.在AndroidManifest.xml文件里配置该Service

    定义了上面的Service之后,接下来须要在AndroidManifest.xml文件里配置该Service。配置Service使用<service../>元素。

与配置Activity相似的是,配置Service时也可为<service../>元素配置<intent-filter../>子元素。用于说明该Service可被哪些Intent启动。

  1. <!--配置一个Service组件-->
  2. <service
  3. android:name=".FirstService">
  4. <intent-filter>
  5. <!--为该service组件的intent-filter配置action-->
  6. <action android:name="com.example.service.FIRST_SERVICE"/>
  7. </intent-filter>
  8. </service>
    Action中的值一定要与程序中创建的Intent的Action的值一致,程序就是依据Action的值来查找对应的Service从而启动它。
    Service是Android四大组件中与Activity最相似的组件,它们都代表可执行的程序。

所以,开发Service类似于开发Activity,我们仅仅需定义一个继承Service的子类而且在AndroidManifest.xml文件里配置该Service后,就能在程序中执行该Serviec。

怎样启动一个Service呢?我们能够在本应用的Activity子类中通过Context.startService()方法或Context.bindService()方法启动一个service,也能够在还有一个应用的Activity子类中通过Context.startService()方法或Context.bindService()方法启动这个service.



3.启动和停止Service

        当Service开发完毕后,我们能够在自身应用的Activity子类中启动该Service,也能够在其它应用中启动该Service。这里,我们在本应用中启动(关闭)该Service,使用Content.startService(Intent
intent)方法。
\src\service\StartService
  1. public class StartServiceTest extends Activity
  2. {
  3. Button start,stop;
  4. @Override
  5. public void onCreate(Bundle savedInstanceState)
  6. {
  7. super.onCreate(savedInstanceState);
  8. setContentView(R.layout.main);
  9. //获取程序界面button中的start、stop两个button
  10. start = (Button) findViewById(R.id.start);
  11. stop = (Button) findViewById(R.id.stop);
  12. //创建启动Service的Intent
  13. final Intent intent = new Intent();
  14. //为Intent设置Action属性
  15. intent.setAction("com.example.service.FIRST_SERVICE");
  16. start.setOnClickListener(new OnClickListener(){
  17. @Override
  18. public void onClick(View arg0)
  19. {
  20. //启动指定Service
  21. startService(intent);
  22. }
  23. });
  24. stop.setOnClickListener(new OnClickListener(){
  25. @Override
  26. public void onClick(View arg0)
  27. {
  28. //关闭指定Service
  29. stopService(intent);
  30. }
  31. });
  32. }
  33. }
     通过以上3步。我们就算完毕了一个Service及使用该Service的应用程序(Service为该应用程序的组成部分)。


升华笔记3:
1.为Intent设置Action属性。主要作用是指定启动哪个Service。当中。"com.example.service.FIRST_SERVICE"在Service的AndroidManifest.xml配置文件里的<service../>元素的<intent-filter../>子元素中配置该Service的action属性。

2.该Activity通过Content.startService(Intent intent)方法启动指定的Service,每当Service被创建时会回调onCreate方法,每次Service被启动时都会回调onStart方法--多次启动一个已有的Service组件将不会再回调onCreate方法。但每次启动时都会回调onStartCommand()方法。

Android笔记二十七.Service组件入门(一).什么是Service?的更多相关文章

  1. Android笔记(十七) Android中的Service

    定义和用途 Service是Android的四大组件之一,一直在后台运行,没有用户界面.Service组件通常用于为其他组件提供后台服务或者监控其他组件的运行状态,例如播放音乐.记录地理位置,监听用户 ...

  2. android笔记:获取View组件宽度以及ViewTreeObserver

    View宽高测量方法: 测量方法有三种,如下: 1)(直接在onCreate()执行) int w = View.MeasureSpec.makeMeasureSpec(0,View.MeasureS ...

  3. Android笔记二十四.Android基于回调的事件处理机制

        假设说事件监听机制是一种托付式的事件处理,那么回调机制则与之相反,对于基于回调的事件处理模型来说,事件源和事件监听器是统一的,或者说事件监听器全然消失了,当用户在GUI控件上激发某个事件时,控 ...

  4. Android进阶(二十七)Android原生扰人烦的布局

    Android原生扰人烦的布局 在开发Android应用时,UI布局是一件令人烦恼的事情.下面主要讲解一下Android中的界面布局. 一.线性布局(LinearLayout) 线性布局分为: (1) ...

  5. Android笔记(六十七) 自定义控件

    实际编程中,系统提供的控件往往无法满足我们的需求,一来是样子丑陋,二来是一些复杂的组合需要多次使用的话,每次都写一堆控件的组合会很耗费时间,所以我们将这些组件的组合自定义为一个新的控件,以后使用的时候 ...

  6. Java基础学习笔记二十七 DBUtils和连接池

    DBUtils 如果只使用JDBC进行开发,我们会发现冗余代码过多,为了简化JDBC开发,本案例我们讲采用apache commons组件一个成员:DBUtils.DBUtils就是JDBC的简化开发 ...

  7. 论文阅读笔记二十七:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(CVPR 2016)

    论文源址:https://arxiv.org/abs/1506.01497 tensorflow代码:https://github.com/endernewton/tf-faster-rcnn 室友对 ...

  8. 多线程学习笔记二之JUC组件

    目录 概述 JUC锁框架图 使用内置锁还是JUC显示锁? 概述   为了对共享资源提供更细粒度的同步控制,JDK5新增了java.util.concurrent(JUC)并发工具包,并发包新增了Loc ...

  9. Java学习笔记二十七:Java中的抽象类

    Java中的抽象类 一:Java抽象类: 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就 ...

随机推荐

  1. 挺苹果的声音,iPhone 5s的两处进步

    苹果iPhone 5s发布后的两处重大进步让我很关注,但看了网上众多网友的点评,又深深的被中国当前手机发烧友圈的这种屌丝文化所震撼,这不是一条正确的道路,这将把中国的手机产业引向歧途,所以我不得不说几 ...

  2. Swift - 使用位运算提取颜色,合并颜色

    通常我们可以使用16进制的格式表示RGB颜色,比如0x2f88c0.通过位操作运算,能很方便的将其中的R,G,B颜色各部分分别提取出来.反之,也可以将R,G,B颜色值组合成一个完整的颜色. 1,提取颜 ...

  3. ASP.NET - URL中参数加密解密操作

    效果: 代码: using System; using System.Text; using System.IO; using System.Security.Cryptography; public ...

  4. POJ 2250(最长公共子序列 变形)

    Description In a few months the European Currency Union will become a reality. However, to join the ...

  5. Linux内核驱动将多个C文件编译成一个ko文件的方法——每一个C文件中都有module_init与module_exit

    以两个C文件为例: 将本该被分别编译成adc_device.ko和adc_driver.ko的adc_device.c.adc_driver.c编译成一个ko文件! 採用方法: 第一步.改动C文件 1 ...

  6. Spark on Mesos: 搭建Mesos的一些问题

    资源管理系统 Spark可以搭建在Mesos上或YARN上,两个都是资源管理系统.了解资源管理系统的话,可以先参看以下几篇文章: 浅谈Borg/YARN/Mesos/Torca/Corona一类系统 ...

  7. Js版游戏打砖块开发过程详细

    最近对js的小游戏开发来了兴趣,前段时间由于回答度娘知道的提问写了个贪吃蛇,虽然难度不大并不复杂,感觉还挺有意思.感觉小时候玩过的什么俄罗斯方块,坦克大战什么的都可以试着用js实现下,这天来了兴致又想 ...

  8. Beautiful Soup 中文文档

    Beautiful Soup 3.0 中文文档说明: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html Be ...

  9. Html.Partial("")与Html.RenderPartial("")区别

    文章有点长,但大多是代码,看看很快的,不要压力太大.网上有很多关于这两个方法的区别,都说出了它本质的区别(不看代码,只看这个结论,就已经足够了,如果觉得有必要从代码中得出这个结论,那就继续往下看),这 ...

  10. delphi实现图象灰度处理的3种方法

    灰度处理的方法主要有如下3种: 1.最大值法:使R.G.B的值等于3值中最大的一个,即:   R=G=B=max(R,G,B) 最大值法会使形成高亮度很高的灰度图象 var bitmap:tbitma ...