安卓四大组件之Service-服务

1、Service是否在主线程中执行,service里面是否能执行耗时的操作?

默认情况下,如果没有特殊指定Service所运行的进程,那么Service的Activity是运行在当前app所在进程的主线程里面的。不仅仅是服务,其实四大组件都是。

主线程不能执行耗时操作(网络请求,拷贝数据库,复制下载大文件)

特殊情况下,可以在清单文件中配置service所在的进程,让service在另外的进程中执行

<service
android:name="com.baidu.location.f"
android:enabled="true"
android:process=":remote" >
</service>

2、Activity怎么和Service绑定,怎么在Activity中启动自己对象的Service?

Activity通过bindService(intent service,ServiceConnecton conn,int flags)跟Service进行绑定,当绑定成功的时候,Service会将代理对象通过回调的形式传递给conn,这样我们就可以拿到Service提供的服务代理对象。

在Activity中两种方式可以开启Service,一种是StartService、一种是bindService,如果需要拿到拿到我们的服务对象,并且去调用里面的方法的时候我们必须使用bind模式开启服务,比如第三方支付,音乐播放等,但是,如果只是需要简简单单的开启一个后台运行的服务的话,我们可以直接使用startService来开启。

3、Service的生命周期

对于Service,不同的开启方式,对应的生命周期也是不同的。

非绑定模式开启:执行onCreate方法后执行onStartCommand,在service被关闭销毁的时候调用onDestroy方法。

绑定模式开启:执行onCreate方法后执行onBind方法,在销毁的时候调用onUnbind和onDestroy方法

上面的两种serviece的生命周期是在相对单纯的情况下来说的,需要注意的是,service的实例只会有一个,也就是说,如果我们当前想要开启的这个service已经存在,那么这一次的开启将不会再调用onCreate方法来实例化!

一个service可以被多个客户所绑定,只有当所有的绑定对象的onbind方法全部执行完了以后,这个service才有机会被销毁,打个比方说,当很多的客户都调用了unbind方法以后,那么如果其中一个客户却调用了onstart方法,那么这个sercice也不会被销毁,也就说说,当所有的客户的去求都完成的时候,才可以销毁服务。

这两种开启服务的方式,并不是完全没有互斥的,他们可以联合开启,比如我们已经用startService开启了一个服务,我们在后面的逻辑中需要调用服务中的方法,那么我们还可以在用bindService来再开启一次,两次开启并不闹矛盾,在这种情况下,我们并不能通过stopself或者stopservice方法来停止我们的服务,必须是我们的所有的客户都解除了对这个服务的绑定后才行。

4、什么是IntentService?有什么优点?

IntentService是Service的子类,比普通的Service增加了功能,Service只能运行在当前应用程序的主线程中,不能在其中处理耗时的操作。

IntentService的特征:

会独立创建一个work线程处理所有的intent请求,会处理onHandleIntent方法中的代码,无需处理多线程的问题,并且在处理完所有的intent请求后,会自动销毁,不需要调用stopService方法来停止。

5、Activity、Service、intent之间有什么关系?

前两个属于兄弟关系,因为他们都继承自ContextWrapper类(Context的子类),但是他们各有各的本事,一个负责界面的交互,一个负责在后台运行。intent可以在他们两者之间进行数据交换,可以看做是一个通讯使者。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏分享达人秀

HelloWorld,我的第一趟旅程出发点

经过前面几期的学习,我们知道了Android的前世今生,也大致了解了Android的系统架构和应用组件,然后花了几期来学习掌握Android的开发环境搭...

20370
来自专栏互联网杂技

没有event loop的PHP

javascript是单线程脚本语言,所以有了event loop机制,但是 php真的有多进程,多线程吗? 一,php利用socket来实现多线程 在服务器端...

29540
来自专栏非著名程序员

Android BLE 基础框架全新改版

? Android BLE基础操作框架,基于回调,操作简单。包含扫描、多连接、广播包解析、服务读写及通知等功能。 项目地址:https://github.co...

37470
来自专栏BeJavaGod

使用Spring ThreadPoolTaskExecutor实现多线程任务

我们为何使用多线程,之前已经有讲过了,为了更快的处理多个任务,分割任务,或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTask...

33850
来自专栏极客猴

详解 Scrapy 中间键的用法

中间件的运用比较广泛,如果直接从定义的角度去理解中间件会有点乱,我以分布式系统为例子进行说明。在上篇文章,我讲到目前后台服务架构基本都是往分布式发展。其实分布式...

10910
来自专栏宋凯伦的技术小栈

Android - 看似内存泄漏,实则不是,记一次内存泄漏的案例分析

  APP中常常会存在内存泄漏的问题,一个简单的测试方法是,多次进入和退出同一页面(Activity),使用adb shell中的dumpsys memi...

205100
来自专栏web编程技术分享

【Java框架型项目从入门到装逼】第四节 - 编写第一个Servlet程序

38960
来自专栏CaiRui

Python 文件和异常

一、从文件中读取数据 #!/usr/bin/env python with open('pi') as file_object: contents =...

215100
来自专栏从零开始学自动化测试

Appium+python自动化14-查看webview上元素(DevTools)

前言 app上webview的页面实际上是启用的chrome浏览器的内核加载的,如何把手机的网页加载到电脑上,电脑的chrome浏览器上有个开发模式,是可以方便...

34850
来自专栏PHP在线

PHP 安全性漫谈

原文出处: 彭长霖 本文所讨论的安全性环境是在Linux+Apache+Mysql+PHP。超出此范围的安全性问题不在本文范畴之内 一、apache serv...

39570

扫码关注云+社区

领取腾讯云代金券