Android Service详解

解决fetch_california_housing数据集403错误的三种实用方法 本文针对机器学习初学者加载fetch_california_housing数据集时常见的HTTPError 403: Forbidden错误,提供了三种经过实测的解决方案。详细介绍了手动下载与本地替换、修改源码下载路径以及配置网络访问策略的具体步骤,帮助用户根据自身网络环境和开发场景选择最佳方法,确保数据集顺利加载。 阅读详情

 

各位肯定知道 Service 作为 Android 的四大组件之一是非常重要的。不过说实话,我实际开发项目中服务用的并不多,(可能和需求有关吧)但是笔试的时候,几乎是必出的题目了,所以我们今天就来仔细的回顾一下 Service 。

1. 什么是服务?

Service 是表示应用程序需求的应用程序组件,在不与用户交互的情况下执行长时间运行的操作,或者给其他应用程序提供使用的功能。Service 是和应用程序在同一个进程中运行的,Service 并不是一个线程,所以它并不是用来处理耗时操作的。

2. 启动服务的方式有几种?(启动服务需要在 AndroidManifest.xml 文件配置)

  • Context.startService()
  • Context.bindService()
  • 先 Context.startService() 在 Context.bindService()

3. Service 的方法和常量有哪些?

ReturnMethode
final Application

getApplication()

返回拥有此服务的Application。

adstract IBinder

onBind(Intent intent)

将通信通道返回给服务。

void

onConfigurationChanged(Configuration newConfig)

当组件运行时,设备配置发生变化时由系统调用。

void

onCreate()

首次创建服务时由系统调用。

void

onDestroy()

由系统调用以通知服务它已不再使用且正在被删除。

void

onLowMemory()

当整个系统内存不足时调用此方法,并且主动运行的进程应调整其内存使用量。

void

onRebind()

当新客户端连接到服务时调用,在此之前,它已经被通知所有客户端在其onUnbind(Intent)中断开连接。

void

onStart(Intent intent,int startId)

此方法在API级别5中已弃用。请实现onStartCommand(Intent,int,int)。

int

onStartCommand(Intent intent,int flags,int startId)

每次客户端通过调用Context.startService(Intent)显式启动服务时,由系统调用,提供它提供的参数和表示启动请求的唯一整数标记。

void

onTaskRemoved(Intent rootIntent)

如果服务当前正在运行,且用户删除了来自服务应用程序的任务,则调用此函数。

void

onTrimMemory(int level)

当操作系统确定是进程从进程中删除不需要的内存的好时机时调用。

boolean

onUnbind(Intent intent)

当所有客户端与服务发布的特定接口断开连接时调用。

final void

startForeground(int flags)

将此服务从前台状态删除,允许在需要更多内存时终止该服务。

final void

startForeground(boolean removeNotification)

同 startForeground(int flags)

final void

startForeground(int id,Notification notification)

如果您的服务已启动(通过Context.startService(Intent)运行),则还要使此服务在前台运行,从而提供在此状态下向用户显示的持续通知。

final void

stopSelf()

停止服务,如果服务之前已经启动。

final void

stopSelf(int startId)

不再返回结果的旧版本的stopSelfResult(int)。

final boolean

stopSelfResult(int startId)

如果最近一次启动的是startId,则停止服务。

Constants
int

START_CONTINUATION_MASK

onStartCommand返回的位(Intent, int, int)描述了如果服务被终止,如何继续服务。

int

START_FLAG_REDELIVERY

如果Intent是先前传递的intent的重新传递,则此标志在onStartCommand(Intent,int,int)中设置,因为该服务先前已返回START_REDELIVER_INTENT但在为该Intent调用stopSelf(int)之前已被杀死。

int

START_FLAG_RETRY

如果意图是重试,则在onStartCommand(Intent, int, int)中设置此标志,因为初始尝试从未到达或从onStartCommand(Intent, int, int)返回。

int

START_NOT_STICKY

从onStartCommand(Intent,int,int)返回的常量:如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),并且没有新的启动意图要传递给它,那么 将服务从启动状态中取出,并且在将来显式调用Context.startService(Intent)之前不要重新创建。

int

START_REDELIVER_INTENT

从onStartCommand(Intent,int,int)返回的常量:如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),则它将被安排重新启动并且最后一次传递的Intent 通过onStartCommand(Intent,int,int)再次传递给它。

int

START_STICKY

从onStartCommand(Intent,int,int)返回的常量:如果此服务的进程在启动时被终止(从onStartCommand(Intent,int,int)返回后),则将其保留在启动状态但不保留此状态 交付 intent。

int

START_STICKY_COMPATIBILITY

从onStartCommand(Intent,int,int)返回的常量:START_STICKY的兼容版本,不保证在被杀死后再次调用onStartCommand(Intent,int,int)。

int

STOP_FOREGROUND_DETACH

stopForeground(int)的标志:如果设置,则先前提供给startForeground(int,Notification)的通知将与服务分离。

int

STOP_FOREGROUND_REMOVE

stopForeground(int)的标志:如果设置,将删除先前提供给startForeground(int,Notification)的通知。

4. 服务的生命周期

(1)Context.startService() 的生命周期。(和开启者的生命周期无关,如果不显示的停止 Service,Service 会一直运行。)

首次启动 Service 会先调用 onCreate() ,然后调用 onStartCommand(),至此 Service 任务就启动了。我们再次启动相同 Service,你会发现只调用了 onStartCommand(),也就是说 onCreate() 只会被调用一次,onStartCommand()会调用多次。当我们停止 Service 会调用 onDestroy(),至此 Service 就停止了。生命周期结束!

  • 测试代码:
public class MyService extends Service {

    public static final String TAG = "My_Service";

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "MyService --> onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "MyService --> onStartCommand");
        return START_STICKY;
    }

    
    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "MyService --> onDestroy");
    }
}
 Intent intent = new Intent(ServiceActivity.this, MyService.class);
 startService(intent);
stopService(intent);
  • 第一次启动 Service 
 D/My_Service: MyService --> onCreate
 D/My_Service: MyService --> onStartCommand
  • 再次启动相同 Service
 D/My_Service: MyService --> onStartCommand
  • 当我们停止服务 Service
 D/My_Service: MyService --> onDestroy

 

(2)Context.bindService() 的生命周期。(和开启者的生命周期绑定,随着开启者的销毁而销毁)

首次启动 Service 会调用 onCreate() ,同样的也是只会调用一次。随后会调用 onBind() 。销毁 Service 会调用先调用onUnbind(),随后会调用 onDestroy()。至此生命周期结束!

  • 测试代码
public class MyService extends Service {

    public static final String TAG = "My_Service";

    @Override
    public IBinder onBind(Intent intent) {
        Log.d(TAG,"MyService --> onBind");
        return new MyBinder();
    }

    @Override
    public boolean onUnbind(Intent intent) {
        Log.d(TAG,"MyService --> onUnbind");
        return super.onUnbind(intent);
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d(TAG, "MyService --> onCreate");
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        Log.d(TAG, "MyService --> onStartCommand");
        return START_STICKY;
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        Log.d(TAG, "MyService --> onDestroy");
    }

    public class MyBinder extends Binder implements IPersonalInif{

        @Override
        public String getName() {
            return "Test Name";
        }
    }

    public interface IPersonalInif {
        String getName();
    }
}
public class MyServiceConnection implements ServiceConnection {

        @Override
        public void onServiceConnected(ComponentName name, IBinder service) {
            mInfoService = (MyService.IPersonalInif) service;
        }

        @Override
        public void onServiceDisconnected(ComponentName name) {

        }

        @Override
        public void onBindingDied(ComponentName name) {

        }
}
Intent intent = new Intent(ServiceActivity.this, MyService.class);
mMyServiceConnection = new MyServiceConnection();
bindService(intent, mMyServiceConnection, Service.BIND_AUTO_CREATE);
Log.d(TAG,"IPersonalInif --> name --> " + mInfoService.getName());
unbindService(mMyServiceConnection);
  • 第一次启动 Service
 D/My_Service: MyService --> onCreate
 D/My_Service: MyService --> onBind
  • 再次启动相同服务 Service

logcat 没有任何输出,也就是再次启动没有任何回调!

  • 我们尝试获取 Service 传递的值
 D/Service_Activity: IPersonalInif --> name --> Test Name
  • 解除 Service 的绑定
 D/My_Service: MyService --> onUnbind
 D/My_Service: MyService --> onDestroy

 

(3)先 Context.startService() 在 Context.bindService() 的生命周期。(这种方式的代码就不贴了,说说场景,和流程吧)

如果 Service 由某个客户端通过 Context.startService() 启动,接下来由其他客户端通过 Context.bindService() 绑定到该 Service,然后在调用 unbindService() 解除该 Service,然后在通过 Context.bindService() 绑定到该 Service,那么生命周期的步骤如下:

onCreate() --> onStartCommand --> onBind() --> onUnbind() --> onRebind()

注意:前提是 onUnbind() 返回 true,读到这里可能会有点疑惑,那就是我明明调用了 unbindService() 方法,系统为什么不调用 Service 的 onDestroy() 呢?这是因为 Service 是我们先 Context.startService() 启动的,所以系统只会调用 onUnbind(),不会调用 onDestroy()。(我们使用 Context.bindService() 绑定一个已经启动的 Service ,系统只是会将 Service 内部的 IBinder 对象传递给 Activity,并不会将 Service 的生命周期和 Activity 的生命周期绑定,所以我们即使调用 unbindService(),也是不会销毁 Service的)

 

至此,Service 的使用以及生命周期已经讲解完了,希望对你有帮助!

欢迎加入Q群一起探讨Android问题。

 

`全网最细!! 入门必看Git教程链接:https://gitee.com/all-about-git` 全网 Git 入门教程 gitee.com。如果显示The requested URL returned error: 403错误,那就表示没有和window本地建立token令牌 阅读详情

相关推荐

ESXI 8.0.3 ubuntu 24.04 直通显卡P40

手把手,一步步教你直通GPU,ESXI 8.0.3 ubuntu 24.04 直通显卡P40

qq_36433118的博客 4682

Android 服务(Service)详解

总结学习类文章 service(服务)是安卓中的四大组件之一,它通常用作在后台处理耗时的逻辑,与Activity一样,它存在自己的生命周期,也需要在AndroidManifest.xml配置相关信息。 服务(Service)是Android中实现程序后台运行的解决方案,它非常适合去执行那些不需要和用户交互而且还要求长期运行的任务。服务的运行不依赖于任何用户界面,即使程序被切换到后台,或者用户打开了另外一个应用程序,服务仍然能够保持正常运行。 不过需要注意的是,服务并不是运行在一个独立的进程当中的,而是依赖

weixin_40862356的博客 1万+

【QML初学者文档】一问读懂QML基础开发(内附大量简单源码)

QML是Qt的一大特色,拥有强大的UI制作能力。但是想要学好QML,还需要一些细节和技巧的掌握。本篇文章将为你提供完整的QML知识体系,让你成为Qt的UI魔法师!

BenBierBa的博客 2万+

Android四大组件——Service详解

Service 为后台运行,不可见,没有界面。优先级高于Activity(内存不足时先杀掉Activity),运行在主线程且不能做耗时操作。

小旭的专栏 7629

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

【Prometheus】prometheus结合cAdvisor监控docker容器运行状态,并且实现实时告警通知

Docker的监控,可以使用Docker自带的stats命令来获取当前主机上运行中的容器的资源使用情况。 例如:容器的CPU使用率、内存占用、网络IO以及磁盘IO等指标。

景天科技苑 6万+

前台service的使用

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 欢迎使用Ma...

mb061的博客 628

【测开求职】面试题:计算机网络 详细版整理

本篇文章是笔者为准备研究生复试和校招而写,因此主要针对问答,注重理解,而不在于细节计算。读者可以先查看上面的链接走一遍计算机网络的整体框架结构。其中,重点难点以及易混淆的知识点,笔者会用其他文章进行了详述,在知识点处贴好了链接,有需要的可以查阅。

vector的博客 5936

Android service介绍——startService和bindService基本使用(1)

Android service介绍——startService和bindService基本使用(1) 问题背景 在安卓日常开发和学习中,经常会使用到Service,它是Android四大组件之一。使用Service可以在后台执行长时间的操作( perform long-running operations in the b...

baorant24的博客 2615

嵌入式工程师成长之路(0)----认识元件

在电子设计与维修中,认识元件是成功的关键!面对琳琅满目的电阻、电容、电感与二极管,样子形式千奇百怪,你是否也曾陷入困难? 本文基于行业权威分类标准,结合十年工程师实战经验,深度解析4大类、30+子类电子元件的核心特性、应用场景与避坑指南,助你从“小白”秒变“电子高手”!

云轩阁 11万+

在claude code desktop中安装pdf处理skill的实战教程

本文介绍了在Claude Code Desktop中安装PDF处理Skill的详细教程。针对国内用户使用第三方API时无法直接调用官方插件的问题,提供了完整的解决方案。教程从下载Anthropic官方Skills源码开始,逐步演示了如何将PDF处理模块打包、上传至Claude Code Desktop,并最终成功加载使用。整个过程采用全流程拆解方式,确保新手也能快速上手。通过本文,读者可以掌握在非官方环境下扩展Claude Code功能的方法,从而提升工作效率

weixin_43178406的博客 9万+

关于Android Service真正的完全详解

Android Service完全详解

QG 3916

1小时读完100篇文献的正确打开方式

各位同仁好,我是七哥。一个在高校里从事人工智能 相关领域研究,钻研用大模型AI实操的学术人。可以和七哥交流学术写作或Gemini、GPT、Claude 等大模型 学术实操相关问题,多多交流,相互成就,共同进步。文献阅读与整理一般都是最先开始、却也最容易被低估的一步。很多学术同仁一开始就陷入越读越多、越读越乱的状态:论文下载了一大堆,但真正能用来支撑自己观点的内容却始终难以提炼出来。一方面,我们需要通过文献了解该研究领域的整体发展脉络,把握当前学界已经讨论到什么程度;

智能AI让学术科研更容易 48

[Android]【安卓】Service详解

[Android]【安卓】Service详解 本篇博客已收录到我的安卓开发小结中——点击【安卓开发小结】 参考资料:《Android总结篇系列:Android Service》 、《第一行代码》 《Android总结篇系列:Android Service》   Service通常总是称之为“后台服务”,其中“后台”一词是相对于前台而言的,具体是指其本身的运行并不依赖于用户可视的UI界面...

Hy的博客 885

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Android】安卓四大组件之服务(Service)详解:从基础到进阶

Service作为安卓应用后台任务处理的核心组件,在保障应用功能完整性和提升用户体验方面起着不可或缺的作用。通过掌握Service的生命周期、分类及使用场景,开发者能够合理设计应用架构,实现高效、稳定的后台任务处理。随着安卓系统的不断升级,Service的使用也需与时俱进,结合新特性和替代方案,让应用在后台运行中发挥更大价值。希望本文能帮助大家深入理解Service,在安卓开发中灵活运用这一强大工具

m0_59734531的博客 1522

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Android Service服务详解

原文转载自:https://blog.youkuaiyun.com/javazejian/article/details/52709857  Service全部内容基本会在本篇涉及到,我们将围绕以下主要知识点进行分析: Service简单概述 Service在清单文件中的声明 Service启动服务实现方式及其详解 Service绑定服务的三种实现方式 关于启动服务与绑定服务间的转换问题 前台服务以及通知...

蜗牛慢爬的李成广 515

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

Service组件详解:IoT-Firstep安卓后台服务开发实战教程

IoT-Firstep是一个全面的物联网开发入门教程项目,涵盖单片机、上位机、移动应用及服务器后台开发等知识。其中安卓后台服务(Service)开发是构建稳定物联网应用的核心环节,本文将通过实战案例详解Service组件在物联网场景中的应用。 ## 一、Service组件核心价值:物联网应用的后台引擎 🚀 在物联网应用开发中,设备连接管理、数据同步、传感器数据采集等功能需要长期在后台运行,这

gitblog_00729的博客 754

android service是什么,Android service是什么 Android service详解

Android service是什么 Android service详解时间:2017-04-06来源:Android开发学习网什么是Android Service?service是Android四大组件之一,其余的是activity、BroadcastReceiver、Content Provider。android service是一个能够在后台执行长时操作的应用程序组件,它不提供用...

weixin_33997566的博客 3923

Android之 Service服务详解

Service服务详解

qq_29848853的博客 5121

安卓之service常用用法详解

安卓一直是半吊子水平,在写一个小东西时,发现自己对service的理解还不够,特总结如下:service的创建public class MinaService extends Service{ private ConnectionThread thread; @Override public void onCreate() { super.onCreate();

aNoobCoder的博客 822

安卓服务Service详解

service(服务)是安卓中的四大组件之一,它通常用作在后台处理耗时的逻辑,与Activity一样,它存在自己的生命周期,也需要在清单文件中配置相关信息,本博客将对Service的各个知识点进行详细讲解。 一Service的基本用法: 1使用本地服务 1)服务的启动方式 1通过Context的startService()方法启动服务:以该方法启动的服务,开启该服务的应用组

(* ̄︶ ̄) 6万+

安卓Service 详解

 Service全部内容基本会在本篇涉及到,我们将围绕以下主要知识点进行分析:Service简单概述Service在清单文件中的声明Service启动服务实现方式及其详解Service绑定服务的三种实现方式关于启动服务与绑定服务间的转换问题前台服务以及通知发送服务Service与线程Thread的区别管理服务生命周期的要点Android 5.0以上的隐式启动问题及其解决方案保证服务不被杀死的实现思...

hdhhd的博客 5万+

3.安卓service详解

1.service生命周期 2.Android中Service(服务)详解:http://blog.youkuaiyun.com/ryantang03/article/details/7770939

strugglelin'blog 323

Android Service用法详解

什么是Service? Service是 Android 系统中的一种组件,它和Activity的级别差不多,但又Activity不同,它是不能与用户交互的,但可以和其他组件进行交互。它不能自己运行,只能后台运行。 Service的特点:没有可视的UI、后台运行,运行不阻塞前台UI、拥有服务的进程具有较高的优先级 Service的生命周期: Android Service的

liuyiming_的专栏 7047

Android之Service详解

与前一篇Android之Activity的细枝末节是同一系列的文章,是自己在学习和研发过程中,对Service的一些知识点的总结,汇总得到这篇文章。这篇文章会从Service的一些小知识点,延伸到Android中几种常用进程间通信方法。

王三的专栏 8630

Android-Service知识详解

service的使用 service的结构

H_xxxxd的博客 5100
上一篇: Android Studio 提交代码出现:Push failed: Failed with error: fatal: unable to access 错误
下一篇: 一个检查输入内容的 AppCompatEditText 。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值