热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解析AndroidService中onStartCommand方法的不同返回值

本文详细探讨了AndroidService组件中onStartCommand方法的四种不同返回值及其应用场景。Service可以在后台执行长时间的操作,无需提供用户界面,支持通过启动和绑定两种方式创建。
解析 Android Service 中 onStartCommand 方法的不同返回值

Android 系统中的 Service 组件能够在后台执行长时间任务,且不需显示用户界面。这种特性使得 Service 成为执行后台操作的理想选择,如数据同步、音频播放等。Service 支持两种主要的创建方式:启动模式和绑定模式。

Service 创建方式

1. 启动模式

当一个组件(如 Activity)通过调用 startService() 方法启动 Service 时,Service 就进入了启动模式。此时,Service 可以在后台无限期运行,即使启动它的组件已经销毁也不会受到影响。启动模式下的 Service 通常用于执行单一任务,如文件上传或下载,任务完成后 Service 会自行停止。

2. 绑定模式

通过调用 bindService() 方法,组件可以与 Service 绑定,从而实现数据交换和通信。绑定模式下的 Service 在没有组件与其绑定时会被销毁。这种方式适合于需要持续交互的服务,如音乐播放控制。

无论是哪种创建方式,Service 的生命周期都遵循特定的流程。本文将重点讨论启动模式下 onStartCommand() 方法的四种返回值及其影响。

onStartCommand() 方法详解

当组件调用 startService() 启动 Service 时,系统会调用 onStartCommand() 方法。此方法返回一个整数,指示系统在 Service 非正常终止时应如何处理。具体返回值包括:

1. START_STICKY_COMPATIBILITY

这是 START_STICKY 的兼容版本,但不保证 Service 被杀死后能重新调用 onStartCommand()

2. START_STICKY

如果 Service 在 onStartCommand() 返回后被系统终止,系统会尝试重建 Service 并重新调用 onStartCommand(),但不会传递上次的 Intent。只有当有新的 Intent 需要处理时,系统才会传递这些 Intent。这种方式适合于那些需要长期运行但不依赖于启动 Intent 的服务,如音乐播放服务。

3. START_NOT_STICKY

如果 Service 在 onStartCommand() 返回后被终止,除非有新的 Intent 需要处理,否则系统不会重建 Service。这是最安全的选择,避免了不必要的资源消耗。

4. START_REDELIVER_INTENT

如果 Service 在 onStartCommand() 返回后被终止,系统会重建 Service 并重新调用 onStartCommand(),同时传递上次的 Intent。如果有多个挂起的 Intent,它们会按顺序传递。这种方式适用于需要立即恢复执行的任务,如文件下载。

代码示例

Service 类

public class MyService extends Service {
private static final String TAG = MyService.class.getSimpleName();
@Override
public void onCreate() {
super.onCreate();
Log.e(TAG, "Service created");
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
Log.e(TAG, "Delayed action executed");
// 产生异常,模拟 Service 被杀
int a = 1 / 0;
}
}, 3000L);
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Log.e(TAG, "onStartCommand called, intent: " + intent + ", startId: " + startId);
return Service.START_STICKY; // 可以更改返回值进行测试
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public void onDestroy() {
Log.e(TAG, "Service destroyed");
super.onDestroy();
}
}

测试类

public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
startService(new Intent(MainActivity.this, MyService.class));
}
}

测试结果分析

1. 使用 START_STICKY 作为返回值

日志显示,当 Service 被异常终止后,系统会自动重建 Service 并调用 onStartCommand(),但 Intent 为空。

2. 使用 START_NOT_STICKY 作为返回值

在这种情况下,Service 被异常终止后,系统不会尝试重建 Service,直到有新的 Intent 发送。

3. 使用 START_REDELIVER_INTENT 作为返回值

当 Service 被异常终止后,系统不仅会重建 Service,还会重新传递上次的 Intent,确保任务的连续性。


推荐阅读
  • Windows服务与数据库交互问题解析
    本文探讨了在Windows 10(64位)环境下开发的Windows服务,旨在定期向本地MS SQL Server (v.11)插入记录。尽管服务已成功安装并运行,但记录并未正确插入。我们将详细分析可能的原因及解决方案。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文详细介绍了Akka中的BackoffSupervisor机制,探讨其在处理持久化失败和Actor重启时的应用。通过具体示例,展示了如何配置和使用BackoffSupervisor以实现更细粒度的异常处理。 ... [详细]
  • MQTT技术周报:硬件连接与协议解析
    本周开发笔记重点介绍了在新项目中使用MQTT协议进行硬件连接的技术细节,涵盖其特性、原理及实现步骤。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 探讨如何通过编程技术实现100个并发连接,解决线程创建顺序问题,并提供高效的并发测试方案。 ... [详细]
  • 深入理解 SQL 视图、存储过程与事务
    本文详细介绍了SQL中的视图、存储过程和事务的概念及应用。视图为用户提供了一种灵活的数据查询方式,存储过程则封装了复杂的SQL逻辑,而事务确保了数据库操作的完整性和一致性。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Android 渐变圆环加载控件实现
    本文介绍了如何在 Android 中创建一个自定义的渐变圆环加载控件,该控件已在多个知名应用中使用。我们将详细探讨其工作原理和实现方法。 ... [详细]
  • UNP 第9章:主机名与地址转换
    本章探讨了用于在主机名和数值地址之间进行转换的函数,如gethostbyname和gethostbyaddr。此外,还介绍了getservbyname和getservbyport函数,用于在服务器名和端口号之间进行转换。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 掌握远程执行Linux脚本和命令的技巧
    本文将详细介绍如何利用Python的Paramiko库实现远程执行Linux脚本和命令,帮助读者快速掌握这一实用技能。通过具体的示例和详尽的解释,让初学者也能轻松上手。 ... [详细]
author-avatar
mobiledu2502908197
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有