本文实例讲述了Android编程实现开始及停止service的方法。分享给大家供大家参考,具体如下:

开始一个Service

你可以从一个activity或从其它应用的组件通过传递一个Intent(指定了要启动的服务)给startService()启动一个服务.Android系统然后调用service的onStartCommand()方法并且把Intent传递给它.(你永远不能直接调用onStartCommand().)

例如,一个activity可以在调用startService()时使用一个明确的intent开始前文的例子中的service(HelloSevice):

Intentintent = new Intent(this, HelloService.class);

startService(intent);

startService()方法会立即返回然后Android系统调用service的onStartCommand()方法.但是如果service尚没有运行,系统会先调用onCreate(),然后调用onStartCommand().

如果service没有提供绑定功能,传给startService()的intent是应用组件与service之间唯一的通讯方式.然而,如果你希望service回发一个结果,那么启动这个service的客户端可以创建一个用于广播(使用getBroadcast())的PendingIntent然后放在intent中传给service,service然后就可以使用广播来回送结果.

不同的启动请求导致对service的onStartCommand()的不同调用,但停止service的请求只有一个(使用stopSelf()或stopService()).

停止一个service

一个"启动的"service必须管理其自己的生命期.这表示,系统不会停止或销毁这种service,除非内存不够用了并且service在onStartCommand()返回后会继续运行.所以,service必须调用stopSelf()停止自己或由另一个组件调用stopService()来停止它.

一旦通过stopSelf()或stopService()发出了停止请求,系统就会尽可能快地销毁service.

然而,如果你的service同时处理多个对onStartCommand()的请求,那么你不应在处理完一个请求之后就停止service,因为你可能已经又收到了新的启动请求(在第个完成后停止将会结束掉第二个).要避免这个问题,你可以使用stopSelf(int)来保证你的停止请求对应于你最近的开始请求.也就是,当你调用stopSelf(int)时,你传递开始请求的ID(传递给onStartCommand()的startId)给service,如果service在你调用stopSelf(int)之前收到一了个新的开始请求,发现ID不同,于是service将不会停止.

注意:你的应用在完成工作后停止它所有的service是非常重要的.这可以避免浪费系统资源和消耗电量.如果需要,其它的组件可以调用stopService()停止service.即使你为service启用了绑定,你也必须自己停止service,甚至它收到了对onStartCommand()的调用也这样.

创建一个绑定的Service

一个绑定的service是允许应用的组件通过调用bindService()来绑定它以创建一个能长期存在的连接(并且一般不允许组件调用startService()来启动它).

当你的activity或其它组件想与service交互或你的应用想基于IPC的向其它应用提供功能时,你应该创建一个绑定的service.

要创建一个绑定的service,你必须实现回调方法onBind(),还要在其中返回一个IBinder,这个IBinder定义了与service通讯的接口.其它应用组件就可以在之后调用bindService()来接收这个接口并开始调用service的方法.service只在有应用组件绑定到它时才活着,所以当没有组件绑定到它时,系统就会宰了它(你不需去停止一个绑定的service,跟用onStartCommand()启动的service不一样).

要创建一个绑定的service,首先要做的就是定义客户端如何与service通讯的接口.这个接口必须是IBinder的一个实现,并且必须被回调方法onBind()返回.一旦客户端接收到IBinder,它就可以开始与service进行交互.

多个客户端可以一起绑定到一个service.当一个客户端完成与service的交互,它调用unbindService()来解除绑定.一旦不再有任何客户端绑定到service,系统就宰了这个service.

有很多方法来实现一个绑定的service并且这些实现要比"开始的"service难懂得多.

发送通知给用户

一旦开始运行,一个service可以通过Toast通知或状态栏通来通知用户一些事件.

一个toast通知是一个出现在当前窗口表面上并过一会就消失的消息.当一个状态栏通知提供一个带有消息的图标到状态栏,用就可以先定它来执行一些动作(比如启动一个activity).

通常,一个状态栏通知是当一些后台工作(比如一个文件下载完成了)完成后通知用户可以对它进行动作的最佳方式.当用户选择这个通知时,它可以开始一个activity(比如可以查看下载的文件).

更多关于Android组件相关内容感兴趣的读者可查看本站专题:《Android基本组件用法总结》

希望本文所述对大家Android程序设计有所帮助。

android 停止服务方法,Android编程实现开始及停止service的方法相关推荐

  1. android socket 服务端,Android socket 服务端

    Android socket 服务端 Android 想在Android 上跑一个 socket 服务端.把在java工程里运行起来的代码直接放到android项目里来,开启线程,创建ServerSo ...

  2. 如何删除windows服务zz 重新安装PostgreSQL时删除上次遗留service的方法

    如何删除windows服务2006-10-10 11:09     作者:网络安全日志( www.nslog.cn ) 日期:2006/10/10  ( 转载请保留此申明) 一.什么是Windows服 ...

  3. android中停止服务,在Android中停止服务

    在这里,我尝试了简单的服务程序.启动服务可以正常工作并生成Toast,但停止服务则不能.此简单服务的代码如下: public class MailService extends Service { @ ...

  4. 基于android志愿服务,基于Android的青年定制志愿者服务系统设计

    文章来源:淘论文网   发布者:毕业设计 浏览量: 参加社会服务已经成为爱心人士日常生活的组成部分.慈善组织除了在社会服务的组织管理方面需要付出很大多的人员劳动和时间.在青年志愿者的义工预约和活动参与 ...

  5. android 后台服务拍照,Android实现后台开启服务默默拍照功能

    本文实例为大家分享了Android后台开启服务默默拍照的具体代码,供大家参考,具体内容如下 最近项目原因,需要编写一后台运行的程序,在给定时间间隔下进行拍照,关键技术主要是:1.开启服务:2.在不不预 ...

  6. android同步服务启动,Android Service的基本用法(startService启动方式生命周期)

    概念:Service作为安卓的四大组件之一,并不像Activity一样,能够被我们看到.通常,它用于在后台为我们执行一些耗时,或者需要长时间执行的一些操作的.(可理解为没有界面的Activity) 使 ...

  7. android 各种服务介绍,Android 网络服务介绍

    1. 介绍 Android网络服务主要包括如下四个部分 -ConnectivityService: 提供数据连接管理服务,包括移动数据.WIFI.以太网等-NetworkPolicyManagerSe ...

  8. java方法重载编程_学java教程之普通方法重载

    学编程吧学java教程之普通方法重载发布了,欢迎通过xuebiancheng8.com来访问 先来看什么是普通方法重载呢,先来看一个例子 public class Person{ String use ...

  9. android从服务检查,android开发分享Android:你如何检查是否启用了特定的AccessibilityService...

    我最后自己做了这个: public boolean isAccessibilityEnabled(){ int accessibilityEnabled = 0; final String LIGHT ...

  10. android无障碍服务网页,android无障碍

    安卓手机无障碍服务指的是什么 许多Android用户有不同的能力(限制),这要CSS布局HTML小编今天和大家分享他们以不同的方式使用他们的Android设备.这些限制包括视力,肢体或与年龄有关,这些 ...

最新文章

  1. 会计期间在ERP开发中的设计思路
  2. linux怎么测试磁盘读写,怎样测试Linux磁盘的读写速率
  3. 深入浅出计算机组成原理学习笔记:高速缓存(下)-你确定你的数据更新了么?(第38讲)...
  4. 通过IFeatureClass 接口查询 IWorkspace, 查询通配符
  5. 【WebRTC---入门篇】(十五)WebRTC信令服务器实现
  6. 《你的灯亮着吗》 读书笔记三
  7. Django终端运行报错:ImportError: DLL load failed while importing _sqlite3: 找不到指定的模块。
  8. C++ 中vector的嵌套使用
  9. 编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n。如果输入的是奇数调用1/1+1/3+...+1/n;...
  10. php连接数据库(一)
  11. python with open as yaml_python – pyyaml并仅使用字符串引号
  12. 定点运算之原码一位乘法
  13. 企业网站网络营销的第一印象
  14. docker部署eureka时无法启动容器(问题解决)
  15. 幼儿园故事导入语案例_幼儿园老师上课常用导入语 课前活跃气氛用这11种方法就对了...
  16. 单页面应用首页白屏时间过长和SEO不友好的问题的一些技术的优缺点和原理
  17. 为了热爱Jeez,请停止在软件中使用正则表达式
  18. 华为起诉三星是中国企业改头换面的开始
  19. 无极性的电容能代替有极性的电容吗?
  20. 历届试题 兰顿蚂蚁 (模拟)

热门文章

  1. 远程接入Linux、unix、Windows工具-opentext ETX
  2. Linux CentOS 学习笔记
  3. element-ui el-upload框去除‘按 delete 键可删除’提示
  4. pta新浪微博热门话题
  5. WTS考勤系统报表实现原理
  6. 记一次ASP绕过WTS-WAF
  7. (1)统一流程管理平台--前言
  8. Codeforces 128 A Statues【预处理+Bfs】
  9. Cousera - Deep Learning - 课程笔记 - Week 15
  10. html邮件 自定义变量,CSS3中的自定义变量样式用法