Android Service启动方式

2023-10-30

1 启动方式
Service 的启动方式主要有两种,分别是 startService bindService
其中, StartService 使用的是同一个 Service, onCreate() 只执行一次,
onStartCommand() 也会执行多次。使用 bindService 启动时, onCreate() onBind() 都只会调用一次。
使用 startService 启动时是单独开一个服务,与 Activity 没有任何关系,而 bindService 方式启动时,
Service 会和 Activity 进行绑定,当对应的 activity 销毁时,对应的 Service 也会销毁。
2 生命周期
2.1 startService
onCreate() :如果 service 没被创建过,调用 startService() 后会执行 onCreate() 回调;如果 service
已处于运行中,调用 startService() 不会执行 onCreate() 方法。
onStartCommand() :多次执行了 Context startService() 方法,那么 Service
onStartCommand() 方法也会相应的多次调用。
onBind( ) Service 中的 onBind() 方法是抽象方法, Service 类本身就是抽象类,所以 onBind() 方法
是必须重写的,即使我们用不到。
onDestory() :在销毁 Service 的时候该方法。
3 Service 不被杀死
 
3.1 onStartCommand 方式中,返回 START_STICKY
调用 Context.startService 方式启动 Service 时,如果 Android 面临内存匮乏,可能会销毁当前运行的
Service ,待内存充足时可以重建 Service 。而 Service Android 系统强制销毁并再次重建的行为依赖于
Service onStartCommand() 方法的返回值,常见的返回值有如下一些。
START_NOT_STICKY :如果返回 START_NOT_STICKY ,表示当 Service 运行的进程被 Android 系统强制   杀掉之后,不会重新创建该Service
START_STICKY :如果返回 START_STICKY ,表示 Service 运行的进程被 Android 系统强制杀掉之后,
Android 系统会将该 Service 依然设置为 started 状态(即运行状态),但是不再保存 onStartCommand
方法传入的 intent 对象,即获取不到 intent 的相关信息。
START_REDELIVER_INTENT :如果返回 START_REDELIVER_INTENT ,表示 Service 运行的进程被
Android 系统强制杀掉之后,与返回 START_STICKY 的情况类似, Android 系统会将再次重新创建该
Service ,并执行 onStartCommand 回调方法,但是不同的是, Android 系统会再次将 Service 在被杀掉
之前最后一次传入 onStartCommand 方法中的 Intent 再次保留下来并再次传入到重新创建后的 Service
onStartCommand 方法中,这样我们就能读取到 intent 参数。
3.Service使用场景

 Service的优点是系统原生支持,使用方便;创建进程方便;可以提供给系统内其他App使用;优先级高,当App退到后台后不宜被杀死。缺点是由于启动Service涉及到多次IPC,运行效率不高,而且受限于系统接口,使用不够灵活。
线程池的优点是运行效率高,配置和使用灵活。缺点是多进程实现不方便, 由于Android实现了一套进程托管机制,我们不能直接创建一个新的进程,而只能通过四大组件的形式创建新的进程。

 一般普通的异步任务,比如网络请求,数据库或者文件相关操作,我们都会使用线程池的方式来做,因为这样使用的系统开销小,运行效率高,而且随着业务逻辑的复杂度增加,扩展性也更强。然而,对于一些特殊场景,比如进程保活,使用第三方SDK服务比如地图,IM等,就需要使用Service来实现,因为这些服务一般与App主进程隔离开,需要运行在新进程中以防止App主进程发生异常崩溃时,牵连第三方服务也挂掉。

 

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

Android Service启动方式 的相关文章

随机推荐

  • Spring整合Ehcache管理缓存

    前言 Ehcache 是一个成熟的缓存框架 你可以直接使用它来管理你的缓存 Spring 提供了对缓存功能的抽象 即允许绑定不同的缓存解决方案 如Ehcache 但本身不直接提供缓存功能的实现 它支持注解方式使用缓存 非常方便 本文先通过E
  • R 与甲骨文数据挖掘

    特点 使用 Oracle Data Miner 和 Oracle R Enterprise 自动化预测分析过程 深入了解企业中常用的各种统计模型 以及如何使用各种 SQL PLSQL ORE ODM 和本机 R 包将它们自动化以进行预测分析
  • MD5

    package com bochy md5 import java security MessageDigest import java security NoSuchAlgorithmException import com sun ma
  • Linux基础——sudo命令

    sudo 用户提升权限的命令 1 新建用户 并且设置密码 root sanchuang useradd panlinfeng root sanchuang echo 123456 passwd panlinfeng stdin 更改用户 p
  • 爱立信携手河北移动护航张家口"雪如意"国际赛事;亚马逊云科技宣布1000万美元教育和奖学金计划

    国内市场 爱立信携手河北移动护航 雪如意 国际赛事 其中 爱立信与河北移动共同探讨 并采用了 2 6G 4 9G载波聚合功能 该功能可对张家口赛区现有核心赛区热点区域的网络进行整合服用 将下行峰值速率提升至3Gbps以上 让网络吞吐率实现了
  • C语言自定义数据类型——联合体

    一 联合体 1 定义 联合也是一种特殊的自定义类型 这种类型定义的变量也包含一系列的成员 特征是这些成员公用同一块空间 所以联合也叫共用体 2 类型声明 union Un int i char c 注 每个成员之间仍是用分号隔开 联合体结束
  • 23.合并K个有序链表

    题目描述 给你一个链表数组 每个链表都已经按升序排列 请你将所有链表合并到一个升序链表中 返回合并后的链表 解题思路 思路一 将所有链表的元素插入vector中 然后将vector排序 再重新形成新的链表 时间复杂度 O N Log N 空
  • java实现五子棋

    java在初期就可以写一些简单的电脑小程序 使用GUI编程可以考验我们的代码能力 之后我会在出一个可能几万字的GUI编程入门 现在我们先看看五子棋 照片我放在最后 代码之后又详细解释 package 数字图像化处理AWT import ja
  • ugui和ngui手写虚拟摇杆功能比较

    第一 ugui点击父图片就移动子图片位置的功能不如ngui好写 第二 ugui没有OnPress回调方法 得手写监听OnPress的事件 第三 ugui用OnDrag来控制子图片有局限性 当鼠标超出摇杆界限时OnDrag没法继续执行 第四
  • 使用docker搭建dvwa环境

    docker search dvwa 搜索官方仓库中关于DVWA的镜像列表 docker pull citizenstig dvwa 下载镜像到本地 docker image ls 列出本地镜像列表信息 docker run name dv
  • java中怎样测试webwervice_junit4单元测试--web项目中模拟登录会话,做全流程测试...

    junit4相对于junit3 基于注解的方式写单元测试用例 使用过程中方便很多 如下缩写均是代码片段 摘录其中关键部分 重要是理解其中知识点 一 编写测试用例基类 RunWith SpringJUnit4ClassRunner class
  • Qt的核心剖析:信息隐藏

    如果你阅读了 Qt 的源代码 你会看到一堆奇奇怪怪的宏 例如 Q D Q Q 我们的Qt源码之旅就从理解这些宏说起 下面先看一个C 的例子 class Person public Person Person string name void
  • UNIX环境高级编程(中文第三版)

    UNIX环境高级编程第三版 操作系统神级书 资料收集于网络 如有侵权 请联系我
  • xss靶场第四关过关秘籍

    首先寻找注入点 输入试一哈 结果发现我们输入的 lt gt 被过滤掉了 我们不使用 lt gt l了接下来换一个方法 我们可以将我们的js代码编写到onclick属性中试一哈 弹窗就说明过关了 看一哈在还有没有别的方法 测试后发现构造事件
  • leveldb官方手册摘录

    本文内容摘自leveldb官方手册 版权归其所有 CHAPTER 1 基本概念 leveldb是一个写性能十分优秀的存储引擎 是典型的LSM树 Log Structured Merge Tree 实现 LSM树的核心思想就是放弃部分读的性能
  • 【趣味编程】线型图统计不同字母的数量

    include
  • 深入理解js数组自定义排序sort

    定义和用法 sort 方法用于对数组的元素进行排序 语法 arrayObject sort function nextValue currentValue code 案例 var arr 5 4 3 2 1 6 7 8 9 倒序 arr s
  • dropout层加在哪里_【Keras】减少过拟合的秘诀——Dropout正则化

    摘要 Dropout正则化是最简单的神经网络正则化方法 阅读完本文 你就学会了在Keras框架中 如何将深度学习神经网络Dropout正则化添加到深度学习神经网络模型里 Dropout正则化是最简单的神经网络正则化方法 其原理非常简单粗暴
  • Qt QSettings读写ini时 General 读不出来值

    简述 我有一个配置文件 其中一个组General 怎么都读不出正确的值 全是空 但是别的组能读出来 改General2试试 果然可以 就怀疑是不是组名称被内置了 打开QSettings的帮助文档 搜索General 有内容 看下解释 The
  • Android Service启动方式

    1 启动方式 Service 的启动方式主要有两种 分别是 startService 和 bindService 其中 StartService 使用的是同一个 Service onCreate 只执行一次 onStartCommand 也