全栈工程师开发手册 (作者:栾鹏)

python教程全解

定义服务(服务的生命周期)

调用context.startService()时依次执行 ->onCreate()- >onStartCommand()->Service running

调用context.stopService()时依次执行 ->onDestroy()

调用context.bindService()时依次执行->onCreate()->onBind()->Service running

调用context.onUnbind()时依次执行 -> onDestroy()

当绑定service和所有客户端解除绑定之后,Android系统将会销毁它,(除非它同时被onStartCommand()方法开启)。

因此,如果你的service是一个纯粹的绑定service,那么你不需要管理它的生命周期。

然而,如果你选择实现onStartCommand()回调方法,那么你必须显式地停止service,因为service此时被看做是开启的。

这种情况下,service会一直运行到它自己调用 stopSelf()或另一个组件调用stopService(),不论它是否和客户端绑定。

另外,如果你的service被开启并且接受绑定,那么当系统调用你的 onUnbind()方法时,如果你想要在下次客户端绑定的时候接受一个onRebind()的调用(而不是调用 onBind()),你可以选择在 onUnbind()中返回true。

onRebind()的返回值为void,但是客户端仍然在它的 onServiceConnected()回调方法中得到 IBinder 对象。

下图展示了这种service(被开启,还允许绑定)的生命周期:

代码示例:

代码中设计服务的生命周期,服务设置为前台服务和后台服务。

package com.lp.app.service;import com.lp.app.Activity1;
import com.lp.app.R;import android.app.Notification;
import android.app.PendingIntent;
import android.app.Service;
import android.content.Intent;
import android.os.Binder;
import android.os.IBinder;
import android.util.Log;//服务的生命周期
public class Service1 extends Service{public final static String action_name = "com.lp.action.service1";public final static String key1 = "key1";public final static String key2 = "key2"; //当服务被创建时,执行oncreat函数@Overridepublic void onCreate() {Log.v("服务生命周期", "服务第一次被启动");pausePlayback();   //将服务放置在后台。默认服务就是后台服务。前台服务是一个通知栏startPlayback("显示标题","显示文本");   //打开一个通知栏,点击通知,可以将服务移动至前台}//onStartCommand为service的重新启动函数@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {//startBackgroundTask(intent, startId);   //将服务设置到后台运行//START_STICKY:如果service进程被kill掉,保留service的状态为开始状态,但不保留递送的intent对象。随后系统会尝试重新创建service,重新启动后参数Intent将为null。//START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统不会自动重启该服务。//START_REDELIVER_INTENT:重传Intent。使用这个返回值时,如果在执行完onStartCommand后,服务被异常kill掉,系统会自动重启该服务,并将原来Intent的值传入。//START_STICKY_COMPATIBILITY:START_STICKY的兼容版本,但不保证服务被kill后一定能重启。//参数flags可以用来确定service的启动方式。START_FLAG_REDELIVERY表示Intent参数是由系统运行时在通过stopSelf显式停止service之前终止它而重新传递的。//FLAF_RETRY表示service已经在异常终止后重新启动,如果service之前被设为START_STICKY,则会传入这个标志Log.v("服务生命周期", "服务被其他窗口通过startService()启动");return Service.START_STICKY; }public class MyBinder extends Binder {Service1 getService() {return Service1.this;}}private final IBinder binder = new MyBinder();@Overridepublic IBinder onBind(Intent intent) {// TODO 自动生成的方法存根Log.v("服务生命周期", "一个客户端正在通过bindService()函数绑定到本服务");return binder;}@Overridepublic void onRebind(Intent intent){//在onUnbind()函数已经被调用过后执行Log.v("服务生命周期", "一个客户端正在通过bindService()函数绑定到当前服务");}@Overridepublic boolean onUnbind(Intent intent){Log.v("服务生命周期", "所有客户端已经通过unbindService()函数脱离绑定");return true;  //返回允许绑定}@Overridepublic void onStart(Intent intent,int startId){Log.v("服务生命周期", "服务启动");super.onStart(intent, startId);}@Overridepublic void onDestroy(){Log.v("服务生命周期", "服务销毁");super.onDestroy();}//将一个service移动至前台//(前台服务:会在通知一栏显示 ONGOING 的 Notification。当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用)//前台服务具有较高的优先级,能在内存不足时,不被杀死private void startPlayback(String contenttitle, String contenttext) {int NOTIFICATION_ID = 1;//创建一个当单击通知时将打开主activity的intentIntent intent = new Intent(this, Activity1.class);PendingIntent pi = PendingIntent.getActivity(this, 1, intent, 0);//设置Notification UI参数Notification notification = new Notification(R.drawable.icon,"启动app窗口", System.currentTimeMillis());notification.setLatestEventInfo(this, contenttitle, contenttext, pi);//设置notification为持续显示notification.flags = notification.flags | Notification.FLAG_ONGOING_EVENT;//将service移到前台。startForeground(NOTIFICATION_ID, notification);}//将service移动到后台public void pausePlayback() {//移动到后台并移除NotificationstopForeground(true);}}

在manifest文件中注册服务

这里我们hi演示显式启动服务和隐式启动服务。所有这里处理设置服务的名称,还设置了触发条件

<!-- service注册服务,其中permission表示要想外部应用程序使用这个服务,必须要包含的自定义权限(只是个名称) -->
<service android:name="com.lp.app.service.Service1"android:permission="com.lp.my_service1_permission"><intent-filter><action android:name="com.lp.action.service1"/><category android:name="android.intent.category.DEFAULT"/></intent-filter>
</service> 

显式的启动和终止服务

  Intent serviceIntent=null;//显示启动一个服务private void explicitStart() {serviceIntent = new Intent(this, Service1.class);startService(serviceIntent);}//显式终止一个服务private void explicitStop() {if(serviceIntent!=null)  stopService(serviceIntent);}

隐式的启动和终止服务

隐式启动,相当于把自定义服务注册为系统服务,再以启动系统服务的方式启动自定义服务。

这种方式的和显式的启动和停止服务不同,而是通过intent触发指定名称的事件。而这个事件又触发了注册在manifest文件中的service,所以需要在manifest文件中注册服务时,设定触发源

  //隐式的启动一个Service。相当于把自定义服务注册为系统服务,再以启动系统服务的方式启动自定义服务private void implicitStart() {Intent intent = new Intent(Service1.action_name);   //在注册服务是设置了intent-filter,所以启动这个,可以启动对应的服务intent.putExtra(Service1.key1, "value1"); intent.putExtra(Service1.key2, "value2"); startService(intent);}//隐式终止一个服务private void implicitStop() {Intent intent = new Intent(Service1.action_name);stopService(intent); }

绑定和解除绑定

//为Service绑定创建一个service连接//service的引用private Service1 serviceRef;//处理service和 activity之间的连接private ServiceConnection mConnection = new ServiceConnection() {//当建立连接时调用此函数public void onServiceConnected(ComponentName className, IBinder service) {serviceRef = ((Service1.MyBinder)service).getService();Log.v("服务绑定客户端", "服务绑定建立连接");}//当service意外断开时执行public void onServiceDisconnected(ComponentName className) {serviceRef = null;Log.v("服务绑定客户端", "服务绑定断开连接");}};Intent bindIntent=null;//绑定一个service和activityprivate void bindToService() {bindIntent = new Intent(this, Service1.class);bindService(bindIntent, mConnection, Context.BIND_AUTO_CREATE);//BIND_AUTO_CREATE表示收到绑定请求的时候,如果服务尚未创建,则即刻创建,在系统内存不足需要先摧毁优先级组件来释放内存,且只有驻留该服务的进程成为被摧毁对象时,服务才被摧毁//BIND_DEBUG_UNBIND通常用于调试场景中判断绑定的服务是否正确,但容易引起内存泄漏,因此非调试目的的时候不建议使用//BIND_NOT_FOREGROUND表示系统将阻止驻留该服务的进程具有前台优先级,仅在后台运行,该标志位位于Froyo中引入}//解除一个绑定private void unbindToService() {if (bindIntent!=null) {unbindService(mConnection);}}

安卓服务service全解,生命周期,前台服务、后台服务,启动注销、绑定解绑,注册相关推荐

  1. WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[中篇]

    在[第1篇]中,我们介绍了WCF关于实例管理一些基本的知识点,包括InstanceContext.InstanceContextMode.已经如何通过ServiceBehaviorAttribute应 ...

  2. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...

  3. Maven补全之生命周期(Lifecycle)

    Maven补全之生命周期(Lifecycle) Maven生命周期基础概念 Maven是基于生命周期构建的,一个Maven项目的构建是已经被清晰定义的过程. 对于我们使用Maven构建项目来说,POM ...

  4. Android生命周期帮助类,Android Service类与生命周期详细介绍_Android_脚本之家

    Android  Service类与生命周期 Service是Android四大组件与Activity最相似的组件,都代表可执行的程序,区别在于Service一直在后台运行且没有用户界面. 1.Ser ...

  5. WCF技术剖析之二十三:服务实例(Service Instance)生命周期如何控制[上篇](转)...

    http://www.cnblogs.com/artech/archive/2009/11/05/1596925.html 服务调用的目的体现在对某项服务功能的消费上,而功能的实现又定义在相应的服务类 ...

  6. Vue的系列之详解生命周期

    生命周期介绍 简单说就是一个组件从开始到最后消亡所经历的各种状态,就是一个组件的生命周期 vue的生命周期图 beforeCreate(创建前) beforeCreate(初始化页面前) 详情:实例初 ...

  7. iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    2019独角兽企业重金招聘Python工程师标准>>> iOS的应用程序的生命周期,还有程序是运行在前台还是后台,应用程序各个状态的变换,这些对于开发者来说都是很重要的. iOS系统 ...

  8. Pod详解-生命周期-钩子函数

    钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码. kubernetes在主容器的启动之后和停止之前提供了两个钩子函数: post start:容器创建之后执行,如果失 ...

  9. session和cookie的区别和联系,session的生命周期,多个服务部署时session管理

    Session和Cookie的区别 对象 信息量大小 保存时间 应用范围 保存位置 Session 小量,简单的数据 用户活动时间+一段延迟时间(一般为20分钟) 单个用户 服务器端 Cookie 小 ...

最新文章

  1. 推荐系统中的前沿技术研究与落地:深度学习、AutoML与强化学习 | AI ProCon 2019...
  2. 北邮王啸:图神经网络的两面性
  3. ES5和6的一些新特性
  4. 北京大学启用人脸识别系统:学生“刷脸”入校
  5. python 树_Python树的概念
  6. FastDFS:Java客户都实现文件的上传、下载、修改、删除
  7. bean找不到报空指针_为什么C指针可以实现函数间的通信呢?
  8. [pytorch、学习] - 9.2 微调
  9. Linux系统编程40:多线程之基于环形队列的生产者与消费者模型
  10. 向一个数组中插入元素
  11. comsol如何定义狄利克雷边界_COMSOL与Visual C++三维电阻抗有限元联合建模与仿真研究...
  12. php cli运行获取参数,php cli传递参数的方法
  13. linux 查看gc情况
  14. 网络抖动、丢音、卡顿
  15. 员工管理系统————员工添加模块
  16. 学习java和html必须要知道的英文单词(入门单词,包括C#)
  17. win10系统快速进入bios的设置方法
  18. python画矢量图_使用基于matplotlib的SciencePlots绘制精美图表
  19. OpenCV打开摄像头《大华摄像头》
  20. 计算机视觉动画视频插帧难点、流程及改进

热门文章

  1. 长话无需短说 讯飞输入法超长语音输入不限时
  2. 第D题 把手放在键盘上时,稍不注意就会往右错一位。
  3. python接口自动化参数化_python接口自动化-参数化
  4. ubuntu mysql自动补全_mysql自动化安装脚本(ubuntu and centos64)
  5. Table 点击单元格编辑并获取对应的行列
  6. html5期末考试题答案,HTML5期末考试题型
  7. QQ资料清空php源码,[php源码][QQ玫瑰小镇]一键收铲种,php网页版
  8. php各种变量特点,(二)PHP语法的特点,变量,常量
  9. mysql 本地热备_MySQL 数据库热备的操作
  10. hive多个表join_8个Hive数据仓工具面试题锦集!