文章目录

Android Service服务的相关介绍

创建方式

启动方式

生命周期

onStartCommand参数及返回值的理解

ServiceConnection

场景说明

前台服务

问答

startService和bindService顺序的影响

如果你的服务也想让其他应用启动那该怎么办

其他

参考

Android Service服务的相关介绍

android service是一种运行在后台,不需要与用户交互的任务

service不是运行在单独的进程中的(当然,如果你想的话也是可以在单独的进程中的),本身还是运行在主线程中,因此如果后台服务是个耗时任务,那么必须得开启线程去执行(因此出现了IntentService)

当进程被杀死,依赖该进程的服务也会被杀死,也就是说当app应用进程被杀死时,服务也停止了,因此不存在说app挂了而它的服务还在跑的情况

实际上service可以理解为一个没有界面的activity,它可以默默地在后台处理一些任务

创建方式

在android中使用service其实很简单,就是继承Service即可,然后在相应的生命周期函数里实现一些功能

当然,作为四大组件之一的service,别完了在清单文件中配置一下servic,不然服务是跑不起来的

生命周期里有个onBind方法,这个onBind是干嘛的呢

一般情况下,如果我们的服务启动后就只是默默地做它自己的任务,不想与外界有任何交流,那么就可以在onBind这个方法里返回null

但假如我们的服务可以对外开放自己的一些能力(在代码里就是开放一堆方法供外界调用),那么就可以把这些要开放的东西写在一个类里,而这个类要实现IBinder接口,然后我们可以在Service类里实例这个IBinder对象,在onBind这个方法里返回这个实例对象

这样客户端连接到这个服务时,就可以拿到这个实例对象,然后就可以愉快地调用服务开放的能力了

启动方式

当服务都写好了,那么该怎么启动这个服务呢

service有两种启动方式,startService和bindService

这两种方式的区别是bindService方式可以被多个Activity绑定,当所有绑定的都解绑后服务才有可能会销毁,之所以说可能,是因为假如服务在bindService之前已经startService了,那么即使后面都解绑了,服务依然会存在

startService一旦跑起来,除非调用stopService或stopSelf或者应用被杀死,否则服务会一直存在,即使中间有人通过unbindService解绑,服务也不会销毁

这里再强调一次,startService启动后服务销毁的条件只能是调用stopService或在服务里stopSelf或者服务所在进程被杀死

既然有了startService,那么bindService是干嘛的呢

bindService主要有两个作用,一个是临时与服务建立本地通信,另一个就是跨进程通信(IPC)了

bindService的生命周期比较短,比如在activity里bindService的话,那么activity销毁时服务也停止了(你在logcat里应该能看到一个异常has leaked ServiceConnection/was originally bound here,这个异常不会导致应用奔溃,但其实就是在提醒你要在适当时机调用unbindService),当然,为了消除这个异常,你完全可以在Activity的onDestroy里调用unbindService,如果你没手动调用unbindService,activity销毁时也会帮你解绑,解绑后如果发现服务不是startService启动的,而且已经没有其他人与之绑定了,那么就会销毁这个服务,只要还有其他人与之绑定,那么服务还是继续存在

生命周期

服务的生命周期与启动方式有一定的联系

startService启动服务的话一般会经历 onCreate --> onStartCommand -> onStart(已经标记过时) -> onDestroy

bindService分为两种,

一种是bindService之前服务还不存在: onCreate --> onBind --> onUnbind --> onDestroy

一种是bindService之前服务已经存在: onBind --> onUnbind --> onDestroy

不管怎么样,反正服务的onCreate只会执行一次,onBind也只会执行一次,这一点牢记即可

当你多次调用startService的话,你会发现onStartCommand和onStart就会被多次调用

当你多次调用bindService,onBind只会执行一次

stopService调用多少次都无所谓,而unbindService与bindService要成对的,否则会引发异常,即调用unbindService时发现之前根本就没有绑定,那么就会跑出异常

为了解决unbindService这个异常,你可以在bindService的ServiceConnection的onServiceConnected的时候设置一个标记,然后根据这个标记来决定是否调用unbindService

onStartCommand参数及返回值的理解

以下是android的默认实现

public @StartResult int onStartCommand(Intent intent, @StartArgFlags int flags, int startId) {

onStart(intent, startId);

return mStartCompatibility ? START_STICKY_COMPATIBILITY : START_STICKY;

}

onStartCommand有三个参数,第一个就是启动这个服务的Intent,这个似乎没什么好说的,需要注意的是这个intent有可能为空,因为服务可能被异常终止,然后被系统重新启动,此时intent为不为空得看之前onStartCommand的返回值

第二个参数flags总共有三个值,0和START_FLAG_REDELIVERY和START_FLAG_RETRY;其中0就是我们正常startService时这个flags就是0,如果我们的服务由于某些异常由android系统重启,那么flags才会是另外两个值;START_FLAG_RETRY表示onStartCommand方法没正常返回时系统进行的重试,START_FLAG_REDELIVERY就是onStartCommand能正常返回,但后边服务遇到异常被系统重启

第三个参数就是每次startService都会进行自增的一个id,这个id的唯一性由系统保证,为啥要有这个id呢,主要是为了防止服务在需要的时候被终止了,试想一下,如果你通过stopSelf()去终止服务的时候,可能有其他人正在执行onStartCommand,说明他正需要这个服务,但却被你终止了

如果你使用stopSelfResult(int starId),那么由于其他人执行到onStartCommand已经产生了新的startId,那么你的这个终止服务的操作就会失效,这样其他人就可以正常使用服务了

看到这里, 推荐你使用stopSelfResult(int starId)而不是stopSelf()

终止服务有stopSelfResult和stopSelf两个方法,如下

* 参数了解完了,让我们看看返回值,其实返回值就是告诉系统在服务被异常终止时该如何重新启动此服务,一般情况下直接用super即可,如果想知道详细的,可以看下这篇文章: Service的onStartCommand方法的返回值和参数详解_风行天下-CSDN博客_startcommand

ServiceConnection

通过bindService这种方式需要一个ServiceConnection对象,这个对象主要有两个回调

new ServiceConnection() {

@Override

public void onServiceConnected(ComponentName componentName, IBinder iBinder) {

}

@Override

public void onServiceDisconnected(ComponentName componentName) {

}

};

在绑定成功后onServiceConnected就会被回调,而且只会回调一次,也就是说你即使多次调用bindService,onServiceConnected也只会执行一次,只有当unbindService后再次bindService,onServiceConnected才会又被调用一次

onServiceDisconnected这个只有在服务崩溃或被终止时才会被调用,unbindService是不会调用到onServiceDisconnected的

onServiceConnected方法里的第二个参数就是我们在Service类里onBind方法返回的对象

场景说明

下载任务的场景非常适合服务,因为你不可能在一个activity里启动下载,然后activity销毁就停止下载了吧,或者你启动下载后去干别的事了,干别的事的过程中又想知道下载的进度等等,那么结合使用startService和bindService就非常有用

假如你有一个任务,这个任务没有界面,也不与任何activity有关系,那么你就可以使用startService,即使是在某个activity里调用startService的,但当activity销毁时service也不会停止,像下载任务这类就比较合适

假如你已经运行到某个activity了,而且你知道后台有个服务在跑,你在某个activity里想知道这个服务的一些信息,那么就可以使用bindService,如果这个服务不存在,那么bindService会创建一个,但activity销毁时这个服务会销毁(如果有多个activity bind的话,那么当最后一个activity销毁时服务才会停止)

假如你知道另外一个进程的服务,想与之交互,那么也可以通过bindService进行跨进程通信

前台服务

服务几乎都是在后台运行的,但是服务的系统优先级还是比较低的,当系统出现内存不足的情况时,就有可能会回收正在后台运行的服务

如果你希望可以一直保持运行状态,而不会由于系统内存不足的原因导致被回收,就可以考虑使用前台服务

前台服务和普通服务最大的区别就在于,他会一直有一个正在运行的图标在系统的状态栏显示,下拉状态栏后可以看到更加详细的信息,非常类似于通知的效果

前台服务最重要的两个api就是

//启动前台服务,前面是一个id,只要不与其他人相同即可,后面的参数是一个Notification 对象,就是会在通知栏显示的那个

startForeground(NOTIFICATION_DOWNLOAD_PROGRESS_ID,notification);

//停止前台服务

stopForeground(true);

问答

startService和bindService顺序的影响

startService启动服务的优先级比较高,就是说当你bindService后再startService,那么当你unbindService后服务还是存在的

如果你的服务也想让其他应用启动那该怎么办

可以使用隐式启动方式在清单文件中给服务一个过滤器,如

android:name="com.example.myjavaexample.MyService"

android:enabled="true" >

intent-filter>

service>

然后其他应用就可以如下启动你的服务了

Intent intent=new Intent();

intent.setAction("com.abc.xxx.myservice");

intent.setPackage("com.example.myjavaexample");//设置应用的包名

startService(intent);

其他

当在activity里bindService而在activity销毁时没有手动调用unbindService时,会抛出类似异常

com.example.myjavaexample.MainActivity has leaked ServiceConnection com.example.myjavaexample.MainActivity$1@d26642d that was originally bound here

这个异常只会打印在日志中,并不会导致你app挂掉

当你bindService成功后在后台任务里把app杀掉,是不会调用onUnbind和onDestroy的

有时发现调用unbindService时并没执行到onUnbind,概率性会这样,不知为何

关于IntentService可以查看这篇文章:Android开发–IntentService的用法,你错过了什么 - 中国人醒来了 - 博客园

参考

(11条消息)Android Service介绍和使用_yh18668197127的博客-CSDN博客_android service

(12条消息)务必知道的Android service的完全详解_林一末的博客-CSDN博客_android service详解

(4条消息)Service的onStartCommand方法的返回值和参数详解_风行天下-CSDN博客_startcommand

android serviceconnection 作用,Android Service服务的相关介绍相关推荐

  1. Android Service服务的相关介绍

    文章目录 Android Service服务的相关介绍 创建方式 启动方式 生命周期 onStartCommand参数及返回值的理解 ServiceConnection 场景说明 前台服务 问答 st ...

  2. Android实现电蚊香/Service服务管理类

    实现这个实例需要的就是Service这个类的管理,我们用到的是启动Service,并在退出应用程序的时候关闭(Stop)Service,下面我们首先看下这个程序的运行截图: 图中显示的控件一个是Ima ...

  3. android coreservice作用,android service重启

    首先,说一下思路,很简单,启动两个service检测对方,如果发现对方killed,立马启动就可以了.具体实现代码如下 1.先准备两个service,CoreService和DaemonService ...

  4. Android meta作用,Android中meta-data的使用

    一.android meta-data 使用详解 android:resource="resourcespecification" android:value="stri ...

  5. android aliasactivity作用,android activity-alias 的作用

    activity-alias是android里为了重复使用Activity而设计的. 当在Activity的onCreate()方法里,执行getIntent().getComponent().get ...

  6. android padding作用,android:padding和android:layout_margin的区别

    简单点来说: android:padding是内边距,控件本身的内容与控件边缘的距离. android:layout_margin是外边距,控件与其他控件之间的距离. 下面以具体的例子来进行解释: 1 ...

  7. android contentprovider作用,Android ContentProvider基本使用

    一.基本概念: 1.ContentProvider为存储和获取数据提供了统一的接口: 2.使用ContentProvider可以在不同的应用程序之间共享数据: 3.Android为常见的一些数据提供了 ...

  8. Android重要组件之一 Service 服务讲解学习(一)

      在Android有异步处理需要重要的Service和Handler组件,今天首先学习一下Service组件,      其中涉及到Android Service中进程间通信和bindService ...

  9. Android 锁屏后Service服务保活(支持9.0)

    最近遇到个问题: 后台Service启动正常启动后,锁屏状态下大概80秒左右Service就被暂停了(并没有被杀死),唤醒屏幕后就继续执行. 解决方法: Service启动时创建一条通知,与其绑定,这 ...

  10. android ims作用,Android IMS 通话应用设计

    以下内容基于Android P code. Android电话模块是一个典型的分层结构设计,如下: 分层结构 IMS在CS通话的基础上增加了telephony/ims net/ims vendor/i ...

最新文章

  1. this指针用法详解
  2. C# -- HttpWebRequest 和 HttpWebResponse 的使用
  3. Struts 配置文件
  4. ssrs 级联参数_在SSRS中使用多值参数
  5. Media Player Classic - HC 源代码分析 5:关于对话框 (CAboutDlg)
  6. Oracle命令--查询语句
  7. H3C交换机创建用户
  8. Android蓝湖图片格式,蓝湖「自动切图」新增 JPG、PDF、WebP 格式
  9. Exp2_固件程序设计 20165226_20165310_20165315
  10. 肯德尔相关性分析_肯德尔的Tau机器学习相关性
  11. modbus调试团结_团结:打破垃圾收集规则
  12. 跨境电商的支付方式有哪些?
  13. 【Python 实战基础】Python 中 PyQt6 的 QPen 介绍
  14. 常见问题---空指针异常
  15. 辽宁省朝阳市谷歌高清卫星地图下载
  16. riak数据库php7,Riak (Engine)
  17. 华为云开天aPaaS服务全球落地,聚力并蓄不断创新,共建生态网络
  18. Fortran语言的入门与心得
  19. 简单明了的区分C++ C语言中声明(declaration)、定义(definition)、签名(signature)的区别
  20. 【历史上的今天】4 月 11 日:Apple I 设计完成;微软官宣“告别” Clippy;伯克利计算机先驱出生

热门文章

  1. linux两台电脑共享文件夹怎么设置,快速几步完美实现两台电脑共享上网的设置...
  2. 软件工程系啦啦队报名表(全部213人)
  3. 布隆过滤器在HBase中的应用
  4. 【Android -- 开源库】Gson 的基本使用
  5. 《Word中从正文开始设置页码》
  6. Vcenter证书过期处理----Vcenter无法登录,“根证书错误”,“签名证书无效”,“503 service not available”
  7. Ubuntu 20.04 LTS 查看 CPU 温度
  8. 假设检验的基本思想及推理方法
  9. mpeg文件格式分析
  10. mysql存储特殊表情符号,解决mysql存储特殊文字(表情符号)utf8mb4