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. 洛谷——P1890 gcd区间

    P1890 gcd区间 题目描述 给定一行n个正整数a[1]..a[n]. m次询问,每次询问给定一个区间[L,R],输出a[L]..a[R]的最大公因数. 输入输出格式 输入格式: 第一行两个整数n ...

  2. shell 指定行插入

    #如果知道行号可以用下面的方法 sed -i '88 r b.file' a.file    #在a.txt的第88行插入文件b.txt awk '1;NR==88{system("cat ...

  3. HTTP Slow Attack测试工具SlowHTTPTest

    HTTP Slow Attack测试工具SlowHTTPTest   Slow Attack是HTTP常见的一种拒绝服务攻击方式.它通过消耗服务器的系统资源和连接数,导致Web服务器无法正常工作.常见 ...

  4. BZOJ 1700 [Usaco2007 Jan]Problem Solving 解题(单调DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1700 [题目大意] 共有p道题目要做,每个月收入只有n元,用于付钱做题之外的部分都会吃 ...

  5. [xsy2123]毛毛虫

    题意:有一棵带点权的树,链修改是把$(x,y)$这条链和与其相邻的节点都加上一个数,查询是问$(x,y)$这条链和与其相邻的节点的权值和 学到了一个新姿势? 考虑树链剖分,在剖重链时每次给当前节点的儿 ...

  6. 【推导】计蒜客17116 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 C. Sum

    题意:S(x)被定义为x的十进制表示下的数位之和.给你x,让你找一个正整数k,使得S(kx)能被233整除.k不超过2千位. 由于x不超过1000000,不论x是多少,10000000重复233次一定 ...

  7. (Mark)JS中关于闭包

    闭包(Closures) 在ECMAScript中,函数是“第一类”对象.这个名词意味着函数可以作为参数被传递给其他函数使用 (在这种情况下,函数被称为“funargs”——“functional a ...

  8. 大于非负整数N的第一个回文数 Symmetric Number

    1.题目 如标题,求大于整数N(N>=0)的第一个回文数的字符串表示形式. 2.样例 1  --> 2 9  -->11 12345 -->12421 123456 --> ...

  9. nio selector

    为什么使用Selector? 仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道.事实上,可以只用一个线程处理所有的通道.对于操作系统来说,线程之间上下文切换的开销很大,而且每 ...

  10. 查看mysql服务器连接

    查看服务器连接,排查连接过多,查看连接状态时特别有用! 命令: show full processlist 作用: 显示当前运行的线程以及状态,也可以根据该命令来查看服务器状态. Id: 连接Id.U ...