android之service

2023-11-17

Service的启动有两种方式:context.startService() 和 context.bindService()

通过startService()启动的服务处于“启动的”状态,一旦启动,service就在后台运行,即使启动它的应用组件已经被销毁了。通常started状态的service执行单任务并且不返回任何结果给启动者。比如当下载或上传一个文件,当这项操作完成时,service应该停止它本身。
还有一种“绑定”状态的service,通过调用bindService()来启动,一个绑定的service提供一个允许组件与service交互的接口,可以发送请求、获取返回结果,还可以通过夸进程通信来交互(IPC)。绑定的service只有当应用组件绑定后才能运行,多个组件可以绑定一个service,当调用unbind()方法时,这个service就会被销毁了。

service与activity一样都存在与当前进程的主线程中,所以,一些阻塞UI的操作,比如耗时操作不能放在service里进行,比如另外开启一个线程来处理诸如网络请求的耗时操作。如果在service里进行一些耗CPU和耗时操作,可能会引发ANR警告,这时应用会弹出是强制关闭还是等待的对话框。所以,对service的理解就是和activity平级的,只不过是看不见的,在后台运行的一个组件,这也是为什么和activity同被说为Android的基本组件。

Service后端的数据最终还是要呈现在前端Activity之上的,因为启动Service时,系统会重新开启一个新的进程,这就涉及到不同进程间通信的问题了(AIDL)


Service启动流程

context.startService() 启动流程:
context.startService()  -> onCreate()  -> onStart()  -> Service running  -> context.stopService()  -> onDestroy()  -> Service stop 


如果Service还没有运行,则android先调用onCreate(),然后调用onStart();
如果Service已经运行,则只调用onStart(), 所以一个Service的onStart方法可能会重复调用多次。 
如果stopService的时候会直接onDestroy,如果是调用者自己直接退出而没有调用stopService的话,Service会一直在后台运行,该Service的调用者再启动起来后可以通过stopService关闭Service。
所以调用startService的生命周期为:onCreate --> onStart (可多次调用) --> onDestroy


context.bindService()启动流程:
context.bindService()  -> onCreate()  -> onBind()  -> Service running  -> onUnbind()  -> onDestroy()  -> Service stop
 
onBind()将返回给客户端一个IBind接口实例,IBind允许客户端回调服务的方法,比如得到Service的实例、运行状态或其他操作。这个时候把调用者(Context,例如Activity)会和Service绑定在一起, Context退出了,Srevice就会调用onUnbind->onDestroy相应退出。 
所以调用bindService的生命周期为:onCreate --> onBind(只一次,不可多次绑定) --> onUnbind --> onDestory。


在Service每一次的开启关闭过程中,只有onStart可被多次调用(通过多次startService调用),其他onCreate,onBind,onUnbind,onDestory在一个生命周期中只能被调用一次。只有通过startService()方法启动service服务时才会调用onStart()方法。


关于Service生命周期



Service的生命周期并不像Activity那么复杂,它只继承了onCreate()、onStart()、onDestroy()三个方法
当我们第一次启动Service时,先后调用了onCreate()、onStart()这两个方法;当停止Service时,则执行onDestroy()方法。
这里需要注意的是,如果Service已经启动了,当我们再次启动Service时,不会在执行onCreate()方法,而是直接执行onStart()方法。
它可以通过Service.stopSelf()方法或者Service.stopSelfResult()方法来停止自己,只要调用一次stopService()方法便可以停止服务,无论调用了多少次的启动服务方法。


IntentService

ntentService使用队列的方式将请求的Intent加入队列,然后开启一个worker thread(线程)来处理队列中的Intent,对于异步的startService请求,IntentService会处理完成一个之后再处理第二个,每一个请求都会在一个单独的worker thread中处理,不会阻塞应用程序的主线程,这里就给我们提供了一个思路,如果有耗时的操作与其在Service里面开启新线程还不如使用IntentService来处理耗时操作。而在一般的继承Service里面如果要进行耗时操作就必须另开线程,但是使用IntentService就可以直接在里面进行耗时操作,因为默认实现了一个worker thread。对于异步的startService请求,IntentService会处理完成一个之后再处理第二个。

IntentService实现

public class HelloIntentService extends IntentService {  
  
  /**  
   * A constructor is required, and must call the super IntentService(String) 
   * constructor with a name for the worker thread. 
   */  
  public HelloIntentService() {  
      super("HelloIntentService");  
  }  
  
  /** 
   * The IntentService calls this method from the default worker thread with 
   * the intent that started the service. When this method returns, IntentService 
   * stops the service, as appropriate. 
   */  
  @Override  
  protected void onHandleIntent(Intent intent) {  
      // Normally we would do some work here, like download a file.  
      // For our sample, we just sleep for 5 seconds.  
      long endTime = System.currentTimeMillis() + 5*1000;  
      while (System.currentTimeMillis() < endTime) {  
          synchronized (this) {  
              try {  
                  wait(endTime - System.currentTimeMillis());  
              } catch (Exception e) {  
              }  
          }  
      }  
  }  
}




http://blog.csdn.net/ithomer/article/details/7364024

http://blog.csdn.net/ithomer/article/details/7366396

http://www.cnblogs.com/allin/archive/2010/05/15/1736458.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android之service 的相关文章

  • 我所有的布局 xml 文件都变成了自动生成的文件

    昨天我的应用程序上的所有内容都运行完美 但今天当我打开 Android Studio 时 所有 xml 文件都已损坏 不确定这是否是正确的术语 每个人都是这样的 我今天遇到了同样的问题 下面是我所做的几个步骤 我取得了成功来解决这个问题 只
  • 键入时将编辑文本中的每个单词大写

    我想在打字时将编辑文本中的每个单词大写 My XML
  • 方法调用 mActionBar=getActionBar() 给出错误[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在使用支持库android support v7 app actionbar因为我想要操作栏API 级别 8以上 但是下面的句子给了我
  • 无法解析符号“AndroidJUnit4”

    显然我需要正确的导入语句来解决这个问题 根据文档用于AndroidJUnit4 http developer android com reference android support test runner AndroidJUnit4 h
  • 如何使用 SyncAdapter 处理远程服务器的 RESTful 更新

    我观看了 Google I O REST 演讲并阅读了幻灯片 http www google com events io 2010 sessions developing RESTful android apps html http www
  • 在旧版本的 API 上更改 ContentObserver Onchange 上的 uri [重复]

    这个问题在这里已经有答案了 可能的重复 如何获取内容观察器中插入行的 URI https stackoverflow com questions 8432800 how to get uri of inserted row in my co
  • 按大小、日期、名称等在回收器视图中排序并记住选择

    我正在制作图库应用程序 我想为其添加排序功能 我可以使用以下命令在运行时对项目进行排序Comparator但问题是 每当我退出应用程序时 列表都会再次从数据库中出来 并且所有列表都未排序 我想在我的应用程序中提供按日期 大小 名称等排序的选
  • 如何通过 Android 中的 Google Fit 集成获取用户信息

    我正在将 Google Fit 应用程序集成到 Android 应用程序中 以使用 SENSORS API 和 HISTORY API 跟踪健身数据 获取步数 如何使用该 API 获取用户信息 电子邮件或用户 ID 对你来说完美的例子 这可
  • 如何处理应用程序对 3d party 的依赖

    我当前正在开发的应用程序依赖于第三方应用程序 OIFileManager 我的问题是处理这些依赖关系的一般方法是什么 告诉用户解决它 嵌入 3d party apk 如果其许可证允许 自动解决 也许Android市场有相应的系统 没有自动的
  • 在应用程序启动期间更改主题的最快方法

    目前 我确实在我的应用程序中根据用户最后的选择提供了 2 个主题 深色主题和浅色主题 在主要活动启动期间 我将执行以下操作 public class MyFragmentActivity extends FragmentActivity O
  • 如何在phonegap上使用GCM处理android中的多个推送通知

    当推送通知到达时 如果用户无法查看该通知 他收到另一条通知 之前的通知正在更新为新的 但它不应该更新为最新的 我们需要单独显示每个通知 这可以使用 GCM 吗 我已经使用Phonegap来开发应用程序 PushPlugin 支持在有效负载中
  • Android 上的 Chrome 强制隐藏地址栏

    我最近开发了一个获取混合 http https 内容的网站 因此 我总是将地址栏显示在顶部 它不会像其他网站那样自动隐藏 这就是我要说的 This https planetkde org 是网站的链接 内容是从各种来源获取的 因此无法过滤非
  • 无法从后台服务通过 WiFi 访问互联网

    我将直接介绍我发现的一些事实 数据 如果您遇到 解决了类似的问题 请帮助我 我每 5 分钟向服务器发送一次数据 除非用户在服务器的帮助下手动将其关闭 wakeful broadcast receiver通过一个intent service
  • AWS MobileHub:重命名 Android / iOS 示例项目

    我是 AWS Mobilehub 的新手 我喜欢它允许我使用 AWS 配置选项创建项目 但是 当我尝试构建应用程序 ios swift android 时 它总是使用我的示例项目作为项目名称 在 AWS 项目的大多数配置设置中 例如使用 c
  • 颤动附近的连接

    当我尝试在设备上做广告或发现时 我收到此错误 但是前一天在环路上效果很好 PlatformException Failure 17 API Nearby CONNECTIONS API is not available on this de
  • 如何增加颤振中切屑的宽度

    我想增加宽度Chip 我怎样才能实现这个目标 Chip elevation 6 0 backgroundColor Colors white shape RoundedRectangleBorder borderRadius BorderR
  • 如何在将数据发送到 Firebase 数据库之前对其进行加密?

    我正在使用 Firebase 实时数据库制作聊天应用程序 我知道 Firebase 非常安全 只要您的规则正确 但我自己可以阅读使用我的应用程序的人的所有聊天记录 我想阻止这种情况 为此我需要一种解密和加密方法 我尝试使用凯撒解密 但失败了
  • getViewByID 对于 Listview 返回 null

    我的 main xml 如下
  • Android - 测试另一个活动是否已开始

    我正在尝试测试以下场景 在自动完成文本视图中输入一个字母 向下滚动并选择其中一个选项 然后单击一个按钮 单击按钮将启动一个新活动 我想检查新活动是否已经开始 这是测试方法 public void testSpinnerUI mActivit
  • 无法读取解析推送通知包数据

    我尝试使用 Parse 推送通知服务发送自定义数据 但从 Bundle 中提取时总是返回 null 值 自定义广播接收器 Override public void onReceive Context context Intent inten

随机推荐

  • 【echarts报错】: ‘normal‘ hierarchy in itemStyle has been removed since 4.0.

    文章目录 报错 分析 解决 报错 charts5 js 7169 ECharts DEPRECATED normal hierarchy in itemStyle has been removed since 4 0 All style p
  • Mac安装sshpass同时解决Calling Non-checksummed download of sshpass formula file from an arbitrary URL报错

    可以直接使用 brew install https raw githubusercontent com kadwanev bigboybrew master Library Formula sshpass rb 但是会报错 Error Ca
  • 软件测试员一定需要懂编程代码吗?

    软件测试人员需要懂代码吗 如果软件测试人员会代码 那还有软件开发人员的事吗 既能测试又能敲代码的人是不是很牛 不管是外行人还是内行人 对一份与自己无关的职业的认识往往缺乏基本的认知 比如今天要说的软件测试 很多人都会对软件测试这个岗位存在一
  • 回顾:网络编程(待排版,知识点看情况补充

    一 CS模型 整个流程 服务器启动后 首先创建一个 或多个 监听socket 并调用bind函数将其绑定到服务器感兴趣的端口上 然后调用listen函数等待客户连接 服务器稳定运行之后 客户端就可以调用connect函数向服务器发起连接 由
  • Java String类型数据转为Byte数据

    方式一 我们可以直接通过Byte decode 方式直接转化内 String str 1 Byte decode Byte decode str System out println decode 方式二 首先我们可以先将String转为i
  • 区块链优秀gitbook资料

    docker 从入门到实践 https yeasy gitbooks io docker practice content image list html go 语言圣经 https docs hacknode org gopl zh ch
  • 双向链表(数据结构)(C语言)

    目录 概念 带头双向循环链表的实现 前情提示 双向链表的结构体定义 双向链表的初始化 关于无头单向非循环链表无需初始化函数 顺序表 带头双向循环链表需要的思考 双向链表在pos位置之前插入x 双向链表的打印 双链表删除pos位置的结点 双向
  • 学习总结4.1 Linux文件权限修改

    Linux系统中的每个文件都有访问许可权限 文件的访问权限分为只读 只写和可执行三种 只读权限表示只允许读其内容 而禁止对其做任何的更改操作 只写权限表示允许修改文件的内容 可执行权限表示允许将该文件作为一个程序执行 每一文件的访问权限都有
  • c/c++笔试面试题_6

    几个简单的c 面试题 2006 10 14 14 50 今天偶然看见这几个面试题 很有感触 想起一年前自己的求职经历 1 引言 本文的写作目的并不在于提供C C 程序员求职面试指导 而旨在从技术上分析面试题的内涵 文中的大多数面试题来自各大
  • 谷歌浏览器Google Chrome离线版(持续更新中)

    谷歌浏览器官方正式版采用自主研发Chromium内核 它是全球受欢迎的谷歌浏览器电脑版 追求速度 隐私安全的网络浏览器 而Google Chrome浏览器离线版更可以在无网络的情况下安装 一 在线版和离线版区别 在线版 即下载官方下载的一个
  • 服务链路追踪(Spring Cloud Sleuth)

    sleuth 英 slu 美 slu n 足迹 警犬 侦探vi 做侦探 微服务架构是一个分布式架构 它按业务划分服务单元 一个分布式系统往往有很多个服务单元 由于服务单元数量众多 业务的复杂性 如果出现了错误和异常 很难去定位 主要体现在
  • java中使用spark如何将column多列合为一列

    接下来介绍几种使用spark将DataFrame中一行的多列合并到一列中 并且该列以不同的类型展示保存 1 建立dataset 自己需要连接的mongo库 private static String datasource 自己需要连接的mo
  • 第十课.图片风格迁移和GAN

    目录 Neural Style Transfer Neural Style Transfer原理 准备工作 定义模型并加载预训练的模型参数 训练target以及结果可视化 生成对抗网络GAN GAN原理 GAN生成Mnist 准备工作 模型
  • 博客系统文章的数据库存储方式

    在通常的博客系统中 我们发表文章的时候 在数据库中存储的一般不仅仅是文章的文字 还包括文章的样式 而且很多时候都是所见即所得的效果 这就要求我们以html 文字这样存进数据库中 通过查找资料 可以用专门的文字编辑器可以实现 使用方法如下 F
  • 系统架构设计师之网络安全-各个层次的网络安全保障

    系统架构设计师之网络安全 各个层次的网络安全保障
  • Map集合知识点整理

    目录 一 Map集合概述 1 特点 2 Map集合的基本功能 二 实现类HashMap集合 1 概述 2 常用方法总结 3 HashMap的底层实现 4 LinkedHashMap 5 TreeMap 三 Map集合的遍历方式 四 案例演示
  • 文献管理软件--zotero基本使用

    文章目录 一 下载与安装 1 下载插件 以火狐浏览器为例 2 注册账户 3 下载桌面版 二 文献导入 1 新建文件 2 导入文献 3 本地导入 4 支持批量下载 三 文献管理 1 添加标签 2 添加子目录 3 添加笔记 四 添加插件 五 数
  • MyBatis的逆向工程

    MyBatis的逆向工程 正向工程 先创建Java实体类 由框架负责根据实体类生成数据库表 Hibernate是支持正向工程的 逆向工程 先创建数据库表 由框架负责根据数据库表 反向生成如下资源 Java实体类 Mapper接口 Mappe
  • 迭代法求解线性方程组(C++实现)

    本系列是数值分析相关算法的文章 这次用迭代法求解线性方程组 不同于上次用高斯消元法之类的求解 迭代法对于稀疏矩阵方程组的运算 会大大提高 而如果用高斯相关的算法求解 会浪费大量资源计算无用的东西 所以有必要研究此算法 本文章主要使用了3个算
  • android之service

    Service的启动有两种方式 context startService 和 context bindService 通过startService 启动的服务处于 启动的 状态 一旦启动 service就在后台运行 即使启动它的应用组件已经