Android中的服务和windows中的服务是类似的东西,服务一般没实用户操作界面。它执行于系统中不easy被用户发觉,能够使用它开发如监控之类的程序。

服务的开发步骤

第一步:继承Service类

public class SMSService extends Service { }

第二步:在AndroidManifest.xml文件里的<application>节点里对服务进行配置:

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





Context.startService()或Context.bindService()

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

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

  • 使用startService()方法启用服务。调用者与服务之间没有关连。即使调用者退出了,服务仍然执行。
    public class HelloActivity extends Activity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
    ......
    Button button =(Button) this.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v) {
    Intent intent = new Intent(HelloActivity.this, SMSService.class);
    startService(intent);
    }});
    }
    }
  • 使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出。服务也就终止,大有“不求同一时候生,必须同一时候死”的特点。

    public class HelloActivity extends Activity {
    ServiceConnection conn = new ServiceConnection() {
    public void onServiceConnected(ComponentName name, IBinder service) {
    }
    public void onServiceDisconnected(ComponentName name) {
    }
    };
    @Override public void onCreate(Bundle savedInstanceState) {
    Button button =(Button) this.findViewById(R.id.button);
    button.setOnClickListener(new View.OnClickListener(){
    public void onClick(View v) {
    Intent intent = new Intent(HelloActivity.this, SMSService.class);
    bindService(intent, conn, Context.BIND_AUTO_CREATE);
    //unbindService(conn);//解除绑定
    }});
    }
    }

生命周期

Context.startService()生命周期

假设打算採用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。

假设调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。

假设是调用者自己直接退出而没有调用stopService的话,Service会一直在后台执行

仅仅能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

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

详细细节见:http://blog.csdn.net/zhaoyazhi2129/article/details/32711481

Context.bindService()生命周期

假设打算採用Context.bindService()方法启动服务。在服务未被创建时。系统会先调用服务的onCreate()方法,接着调用onBind()方法。

这个时候调用者和服务绑定在一起,调用者退出了。系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。

假设调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。

假设调用者希望与正在绑定的服务解除绑定,能够调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

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

一但销毁activity它就结束。假设按home把它放到后台,那他就不退出。

详细细节见:http://blog.csdn.net/zhaoyazhi2129/article/details/32712073



补充:

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

赵雅智_service生命周期的更多相关文章

  1. 赵雅智_Fragment生命周期

    官网帮助文档链接:  http://developer.android.com/guide/components/fragments.html 主要看两张图.和跑代码 一,Fragment的生命周 w ...

  2. 赵雅智_service电话监听2加接通电话录音

    步骤: 创建CallStateService继承Service 取得电话服务 监听电话动作 电话监听的对象 没有电话时 停止刻录 重设 刻录完毕一定要释放资源 电话响铃时 从麦克风採集声音 内容输出格 ...

  3. 赵雅智:service_startService生命周期

    案例演示 布局文件 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xm ...

  4. 赵雅智:service_bindService生命周期

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvemhhb3lhemhpMjEyOQ==/font/5a6L5L2T/fontsize/400/fill/I0 ...

  5. 赵雅智_BroadcastReceiver

    BroadcastReceiver  用于接收程序(包含用户开放的程序和系统内建程序)所发出的Broadcast intent 耗电量 开机启动 窃取别人短信 窃取别人电话 开发: 创建须要启动的Br ...

  6. 赵雅智_Swift(1)_swift简单介绍及类型

    Swift 是 iOS 和 OS X 应用开发的一门新语言. 假设你有 C 或者 Objective-C 开发经验, Swift 的非常多内容都是你熟悉的. Swift 的类型是在 C 和 Objec ...

  7. 赵雅智_Fragment

    当我们须要动态的多界面切换的时候,就须要将UI元素和Activity融合成一个模块. 在2.3中我们一般通过各种Activity中进行跳转来实现多界面的跳转和单个界面动态改变.在4.0或以上系统中就能 ...

  8. 赵雅智:android教学大纲

    带下划线为详细内容链接地址.点击后可跳转.希望给大家尽一些微薄之力.眼下还在整理中 教学章节 教学内容 学时安排 备注 1 Android高速入门 2 Android模拟器与常见命令 3 Androi ...

  9. 赵雅智_ContentProvider

    ContentProvider介绍 ContentProvider是不同应用程序之间进行交换数据的标志API 也就是说:一个应用程序通过ContentProvider暴露自己的数据操作接口,那么无论该 ...

随机推荐

  1. textbox获取当前光标位置,在光标后面插入字符串

    左侧输入要复制的字符串,点击复制btn,将左侧字符串复制到后侧, 示例: 输入框                复制后 12345 12345 (光标落在3后) aaa 123aaa45(光标落在4后 ...

  2. HDU 3339 In Action【最短路+01背包模板/主要是建模看谁是容量、价值】

     Since 1945, when the first nuclear bomb was exploded by the Manhattan Project team in the US, the n ...

  3. 性能测试篇:LoadRunner11 压力测试实例笔记

    最近在学习用loadrunner做web性能测试,简单记录一下一个自学实例流程. 1.录制测试脚本 (1).打开LR11,点击create/edit Script来打开VUgen (2).点击新建 ( ...

  4. SVN版本控制软件

    一.版本控制软件 1.为什么需要版本控制软件 问题:① 团队开发 ② 异地协作 ③ 版本回退 2.解决之道 SCM(Software Configuration Management):软件配置管理 ...

  5. PL\SQL结构控制、异常

    PL\SQL结构控制    1.IF条件控制语句(三种基本方式+IF语句的嵌套使用)        (1)IF...        (2)IF...ELSE        (3)IF...ELSIF. ...

  6. response (响应对象)

    一.response响应过程 在去发送一个请求时, 会找到tomcat引擎 引擎会找到对应的web应用,并且会创建request对象和response对象 找到应用后, 会执行应用的web.xml再去 ...

  7. [USACO 2018 Open Gold] Tutorial

    Link: 传送门 A: 对于每一条分割线,设本不应在其左侧的个数为$x$ 重点要发现每次一来一回的操作恰好会将一对分别应在左/右侧的一个数从右/左移过去 这样就转直接用树状数组求出最大的$x$即可 ...

  8. 【BFS】Pots

    [poj3414]Pots Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16925   Accepted: 7168   ...

  9. Perl中的数组&哈希应用

    哈希和数组是Perl中较为常用的结构,本文则重点讨论数组和哈希的一些基本用法,供广大喜爱Perl的同学们交流学习. 哈希 Perl中的哈希表类似于Python中的字典结构,由(键=>值)对构成, ...

  10. [转]ibatis中井号跟美元符号区别(#、$)

    Mybatis中如何在SQL语句表名中使用参数 insert into prefix_${table_name} (a, b, c) values (#{a}, #{b}, #{c}) ${} 表示直 ...