导航

公墓网

当前位置: 首页 > 公墓资讯

android service、android service下载

更新时间:2025 09 18 14:50:29 作者 :庆美网 围观 : 34次

大家好,今天来为大家解答android service、android service下载这个问题的一些问题点,包括也一样很多人还不知道,因此呢,今天就来为大家分析分析,现在让我们一起来看看吧!如果解决了您的问题,还望您关注下本站哦,谢谢~

PowerManagerService提供Android系统的电源管理服务,主要功能是控制系统待机状态,屏幕显示,亮度调节,光线/距离传感器的控制等。

相关代码在以下文件中:

初始化流程

android service、android service下载

跟其他系统服务一样,PowerManagerService也是继承于SystemService并通过SystemServer启动。

SystemServer

frameworks/base/services/java/com/android/server/SystemServer.java

PowerManagerService

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

在SystemServer的startBootstrapServices中,通过SystemServiceManager.startService启动了PowerManagerService,下面首先来看PowerManagerService构造方法。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

PowerManagerService构造函数中首先创建了处理消息的进程及对应的handler对象以进行消息处理,然后创建SuspendBlocker对象,用于WakeLocks与Display,并设置mWakefulness的初始状态为WAKEFULNESS_AWAKE,最后进入到native层初始化。下面先看一下关于mWakefulness的定义。

继续回到PowerManagerService构造函数的native初始化中,首先来看nativeInit的实现。

frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp

nativeInit的主要任务时装载power模块,该模块由厂商实现,以高通为例,如下。

device/qcom/common/power/power.c

power_module中实现了init,powerHint,setInteractive,nativeInit最终调用到HAL power模块的power_init具体实现中。接着看native初始化nativeSetAutoSuspend的实现。

frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp

system/core/libsuspend/autosuspend.c

nativeSetAutoSuspend最终调用到libsuspend(参考Android电源管理系列之libsuspend)的autosuspend_disable禁止系统休眠。继续看native初始化nativeSetInteractive,nativeSetFeature的实现

frameworks/base/services/core/jni/com_android_server_power_PowerManagerService.cpp

同nativeInit一样,最终都是调用到HAL power模块的具体实现中。以上是构造函数的分析流程,下面继续看PowerManagerService在系统启动过程中回调onStart(),onBootPhase(),systemReady()的实现。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

public void onStart() {

publishBinderService(Context.POWER_SERVICE, new BinderService());

publishLocalService(PowerManagerInternal.class, new LocalService());

Watchdog.getInstance().addMonitor(this);

Watchdog.getInstance().addThread(mHandler);

}

private final class BinderService extends IPowerManager.Stub {

……

private final class LocalService extends PowerManagerInternal {

……

}

onStart()中发布了BinderService,LocalService分别供其他进程,进程内其他服务调用,并将PowerManagerService加入到Watchdog监控中。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

onBootPhase中主要设置mBootCompleted状态,更新PowerState状态,并执行mBootCompletedRunnables中的runnables方法(低电量模式会设置)。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

userActivity

userActivity是定义在PowerManager中的SystemApi,用户向PowerManagerService报告用户活动,以更新PowerManagerService内部时间/状态值,推迟系统休眠的时间。下面首先来看userActivity的定义。

frameworks/base/core/java/android/os/PowerManager.java

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

PowerManager中userActivity请求调用服务端PowerManagerService BinderService的userActivity,即调用内部方法userActivityInternal。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

userActivityInternal中首先调用userActivityNoUpdateLocked更新相关数据及状态(***NoUpdateLocked仅仅更新内部状态并不采取任何操作),然后调用updatePowerStateLocked更新所有PowerState,下面分析userActivityNoUpdateLocked的实现,updatePowerStateLocked是PowerManagerService的核心方法,在最后进行分析。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

gotoSleep

gotoSleep在PowerManager中的定义如下:

frameworks/base/core/java/android/os/PowerManager.java

与userActivity一样,gotoSleep最终将调用到goToSleepInternal。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

goToSleepInternal中将执行goToSleepNoUpdateLocked更新内部状态,同样在updatePowerStateLocked中更新PowerState的操作。

frameworks/base/services/core/java/com/android/server/power/PowerManagerService.java

goToSleepNoUpdateLocked中更新mLastSleepTime,mWakefulness,mDirty状态。

Android Service 详解

Service 是四大组件之一,后台运行的解决方案,适合那些不需要和用户交互还要长期运行的任务。Service 的运行不依赖于任何用户界面,即使 app 被切到后台,Service 仍能够正常运行。当某个程序进程被杀掉时,所有依赖于该进程的 Service 也会停止

使用时必须在清单文件中声明服务如:

Service 与 Thread 的区别

  • Thread 是 cpu 执行的最小单元,它是分配 cpu 的基本单位,用来执行异步操作
  • Service 是安卓的一种机制,运行于主线程的 Service 是 Context 的子类,可以调用 Context 的所有方法。可以通过 startService, stopService, bindService, unbindService 来控制它,也可以在 Service 里注册 BroadcastReceiver 在其它地方发送广播来控制它。这些都是 Thread 做不到的

生命周期

  • onCreate()首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand(), onBind() 之前)。
  • onStartCommand()当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)
  • onBind()当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC(跨进程调用远程函数))时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回 null。
  • onDestroy()当服务不再使用且将被销毁时,系统将调用此方法。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。这是服务接收的最后一个调用。
  • 如果一个 Service 被 startService 方法多次启动,onCreate 方法只会调用一次,onStartCommand 方法可能会调用多次(对应 startService 调用的次数),即系统只会创建一 Service 的一个实例,所以只需要调用一次 stopService
  • 被启动又被绑定的 Service,也必须调用(stopSelf 或 stopService)+(unbindService 或 Context 回收自动 unbind)才能停止服务(不分先后顺序)
  • 系统资源不足,系统有可能直接结束服务

启动方式

  • startService 只是启动 Service,启动它的组件(如 Activity)和 Service 并没有关联,只有当 Service 调用 stopSelf 或者其他组件调用 stopService 服务才会终止。
  • bindService 方法启动 Service,其他组件可以通过回调获取 Service 的代理对象和 Service 交互,而这两方也进行了绑定,当启动方销毁时,Service 也会自动进行 unBind 操作,当发现所有绑定都进行了 unBind 时才会销毁 Service。
  • startService() 方法将立即返回,且 Android 系统调用服务的 onStartCommand() 方法并向其传递 Intent。(切勿直接调用 onStartCommand())

停止 Service

  • 一旦请求使用 stopSelf() 或 stopService() 停止服务,系统就会尽快销毁服务。(Service.stopSelf 等同于 Context.stopService)
  • 如果服务同时处理多个 onStartCommand() 请求,则您不应在处理完一个启动请求之后停止服务,因为您可能已经收到了新的启动请求(在第一个请求结束时停止服务会终止第二个请求)。为了避免这一问题,您可以使用 stopSelf(int) 确保服务停止请求始终基于最近的启动请求。也就说,在调用 stopSelf(int id) 时,传递与停止请求的 ID 对应的启动请求的 ID(传递给 onStartCommand() 的 startId) 。然后,如果在您能够调用 stopSelf(int) 之前服务收到了新的启动请求, ID 就不匹配,服务也就不会停止。
  • 当服务被终止的时候,用户是无感知的。所以可用于不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。

IntentService

Service 的子类,它使用工作线程逐一处理所有启动请求。如果您不要求服务同时处理多个请求,这是最好的选择。您只需实现 onHandleIntent() 方法即可,该方法会接收每个启动请求的 Intent,使您能够执行后台工作。

IntentService 特性:

  • 创建默认的工作线程,用于在应用的主线程外执行传递给 onStartCommand() 的所有 Intent。
  • 创建工作队列,用于将一个 Intent 逐一传递给 onHandleIntent() 实现,这样您就永远不必担心多线程问题。
  • 在处理完所有启动请求后停止服务,因此您永远不必调用 stopSelf()。
  • 提供 onBind() 的默认实现(返回 null)。
  • 提供 onStartCommand() 的默认实现,可将 Intent 依次发送到工作队列和 onHandleIntent() 实现。
  • 通过封装 Handler 和 Thread 实现异步任务

onStartCommand

onStartCommand() 方法必须返回整型数。整型数是一个值,用于描述系统应该如何在服务终止的情况下继续运行服务(如上所述,IntentService 的默认实现将为您处理这种情况,不过您可以对其进行修改)。从 onStartCommand() 返回的值必须是以下常量之一:

  • START_NOT_STICKY 如果系统在 onStartCommand() 返回后终止服务,则除非有挂起 Intent 要传递,否则系统不会重建服务。这是最安全的选项,可以避免在不必要时以及应用能够轻松重启所有未完成的作业时运行服务。
  • START_STICKY 如果系统在 onStartCommand() 返回后终止服务,则会重建服务并调用 onStartCommand(),但绝对不会重新传递最后一个 Intent。相反,除非有挂起 Intent 要启动服务(在这种情况下,将传递这些 Intent ),否则系统会通过空 Intent 调用 onStartCommand()。这适用于不执行命令、但无限期运行并等待作业的媒体播放器(或类似服务)。
  • START_REDELIVER_INTENT 如果系统在 onStartCommand() 返回后终止服务,则会重建服务,并通过传递给服务的最后一个 Intent 调用 onStartCommand()。任何挂起 Intent 均依次传递。这适用于主动执行应该立即恢复的作业(例如下载文件)的服务。

bindService & unbindService

绑定服务允许应用组件通过调用 bindService() 与其绑定,以便创建长期连接.

如需与 Activity 和其他应用组件中的服务进行交互,或者需要通过进程间通信 (IPC) 向其他应用公开某些应用功能,则应创建绑定服务。

要创建绑定服务,必须实现 onBind() 回调方法以返回 IBinder,用于定义与服务通信的接口。然后,其他应用组件可以调用 bindService() 来检索该接口,并开始对服务调用方法。服务只用于与其绑定的应用组件,因此如果没有组件绑定到服务,则系统会销毁服务(您不必按通过 onStartCommand() 启动的服务那样来停止绑定服务)。

要创建绑定服务,首先必须定义指定客户端如何与服务通信的接口。服务与客户端之间的这个接口必须是 IBinder 的实现,并且服务必须从 onBind() 回调方法返回它。一旦客户端通过 ServiceConnection.onServiceConnected()收到 IBinder,即可开始通过该接口与服务进行交互。

实现绑定服务时,最重要的环节是定义您的 onBind() 回调方法返回的 IBinder,用以提供客户端用来与服务进行交互的编程接口。您可以通过三种方法定义接口:

  • 扩展 Binder 类:Service 仅供自有应用专用,且与客户端位于相同进程。不以这种方式创建接口的唯一原因是,您的服务被其他应用或不同的进程占用。使用方法:
    • 包含客户端可调用的公共方法
    • 返回当前 Service 实例,其中包含客户端可调用的公共方法
    • 或返回由服务承载的其他类的实例,其中包含客户端可调用的公共方法
    • 在您的服务中,创建一个可满足下列任一要求的 Binder 实例:
    • 从 onBind() 回调方法返回此 Binder 实例。
    • 在客户端中,从 onServiceConnected() 回调方法接收 Binder,并使用提供的方法调用绑定服务。

示例:客户端可以调用 getServices 方法,获取 Service 的引用与其交互

  • 使用 Messenger: 如需让接口跨不同的进程工作,则可使用 Messenger 为服务创建接口。服务可以这种方式定义对应于不同类型 Message 对象的 Handler。此 Handler 是 Messenger 的基础,后者随后可与客户端分享一个 IBinder,从而让客户端能利用 Message 对象向服务发送命令。此外,客户端还可定义自有 Messenger,以便服务回传消息。这是执行进程间通信 (IPC) 的最简单方法,因为 Messenger 会在单一线程中创建包含所有请求的队列,这样您就不必对服务进行线程安全设计。
  • 使用 AIDL: AIDL(Android 接口定义语言)执行所有将对象分解成原语的工作,操作系统可以识别这些原语并将它们编组到各进程中,以执行 IPC。之前采用 Messenger 的方法实际上是以 AIDL 作为其底层结构。如上所述,Messenger 会在单一线程中创建包含所有客户端请求的队列,以便服务一次接收一个请求。不过,如果您想让服务同时处理多个请求,则可直接使用 AIDL。在此情况下,您的服务必须具备多线程处理能力,并采用线程安全式设计。(多数应用“都不会”使用 AIDL 来创建绑定服务,因为它可能要求具备多线程处理能力,并可能导致实现的复杂性增加。因此,AIDL 并不适合大多数应用,本文也不会阐述如何将其用于您的服务。)

当客户端被销毁时,它将取消与服务的绑定,但您应该始终在完成与服务的交互时或您的 Activity 暂停时取消绑定,以便服务能够在未被占用时关闭。

管理 bindService 的生命周期

同时使用 bindService 和 startService

前台 Service

由于后台服务优先级相对比较低,当系统出现内存不足的情况下 前台服务被认为是用户主动意识到的一种服务,因此在内存不足时,系统也不会考虑将其终止。前台服务必须为状态栏提供通知,这意味着除非服务停止或从前台删除,否则不能清除通知。如:

  • 应该将从服务播放音乐的音乐播放器设置为在前台运行,这是因为用户明确意识到其操作。
  • 状态栏中的通知可能表示正在播放的歌曲,并允许用户启动 Activity 来与音乐播放器进行交互。
  • 天气应用

要请求让服务运行于前台,请调用 startForeground()。此方法取两个参数:唯一标识通知的整型数和状态栏的 Notification。例如:

要从前台删除服务,请调用 stopForeground()。此方法取一个布尔值,指示是否也删除状态栏通知。此方法绝对不会停止服务。但是,如果您在服务正在前台运行时将其停止,则通知也会被删除。

总结

关于android service、android service下载,的介绍到此结束,希望对大家有所帮助。

用户评论

有一种中毒叫上瘾成咆哮i

终于找到关于Android Service的文章了!我一直想学习如何利用Service来实现后台任务,现在看来这篇文章讲解得非常清晰,很容易理解!

    有19位网友表示赞同!

情如薄纱

之前一直没遇到过Service这类东西,看了这篇帖子终于懂一点儿了,感觉学习下应该还是挺有用的。就是下载链接在哪里啊? 希望能分享一下具体的资源。

    有17位网友表示赞同!

来瓶年的冰泉

想做点后台功能应用,但每次都看各种文档还搞不明白Android Service怎么用,这篇文章太宝贵了!特别是讲解的例子很清晰,我现在好像开始Get到它是怎么运作的...

    有6位网友表示赞同!

大王派我来巡山!

下载地址还是失效啊, 你有其他下载链接吗?感觉这个 Android Service 资源很棒,想早点试一试!

    有13位网友表示赞同!

素衣青丝

Android Service的东西学起来挺难的,很多东西都需要深入理解系统架构才能掌握。不过这篇文章讲得挺全面的,起码让我对Service有了基本概念。希望以后写一些更高级的内容解析。

    有12位网友表示赞同!

没过试用期的爱~

我本来想做个音乐播放器,后台循环播放功能必须依赖Service啊!这篇帖子的讲解非常棒,直接点出了关键知识点,下载资源也很方便,太赞了!

    有15位网友表示赞同!

敬情

看了很多Android Tutorial 都没找到什么可靠的Service学习资料,幸好看到了这篇文章!文章讲解清晰易懂,还有实际案例分析,对我提升理解很有帮助。

    有16位网友表示赞同!

执拗旧人

这个下载链接是失效的,建议更换或发布到新的网站平台, 方便大家下载资源!

    有5位网友表示赞同!

寒山远黛

Android Service真不是一般的复杂,感觉这篇帖子过于简化,对初学者未必有太多帮助...

    有17位网友表示赞同!

墨染天下

我对 Android 的开发越来越感兴趣了,希望能学着做点实用的 app。希望作者能继续更新一些更有深度的内容,比如深入探讨Service的生命周期管理等等。

    有6位网友表示赞同!

素婉纤尘

这篇文章对我理解 Android Service 的作用很有帮助,尤其是在讲解如何实现长轮询任务的部分,受益匪浅!

    有7位网友表示赞同!

烬陌袅

我试着用这种方式下载了Android Service的资源后,发现有很多重复的文件和无法识别的文件。建议作者再次整理一下资源包,不要太混乱...

    有5位网友表示赞同!

┲﹊怅惘。

文章里面提到的 Service 应用场景真不少啊,以后有空也要试试用它的优势去开发一些应用。

    有18位网友表示赞同!

空谷幽兰

Android 服务到底是个什么东西啊?感觉这篇文章写的太专业了,我一个新手看了半天还是一头雾水,能否提供更简单的解释?

    有7位网友表示赞同!

夏日倾情

总觉得现在的 Android 开发越来越注重后台操作,Service 的学习需求也越来越大。这篇帖子讲解比较清晰,下载资源方便,好评!

    有14位网友表示赞同!

(り。薆情海

下载链接失效了,作者建议修改页面,方便大家获取资料!内容还不错,希望能更新更详细的案例分析。

    有14位网友表示赞同!

落花忆梦

我觉得这篇帖子的标题写的太笼统了,应该更加具体,比如:"深入解析Android Service: 常见应用场景及开发技巧"这样更能吸引到目标读者。其他的内容还是比较不错的。

    有13位网友表示赞同!

呆萌

我对安卓系统一直觉得没那么多学习点,直到看了这篇文章才知道还有这么关键的服务机制!作者分析真够透彻的,让我对 Android 开发有了新的认识 。

    有10位网友表示赞同!

标签: 公墓资讯
相关资讯
  • XT316手机电池更换指南

    MotoXT316使用2.8英寸的QVGA电容触摸屏。该屏幕支持两点触摸,并具有相对敏感的触摸响应。尽管其分辨率是QVGA,但颜色繁殖和亮度还不错。与某些具有相

    2025-09-18 13:15:37 公墓资讯 
  • plc 施耐德 plc施耐德软件

    西门子PLC的优点有:1.西门子PLC可靠性高,抗干扰能力强,西门子plc高可靠性是电气控制设备的关键性能。西门子PLC由于采用现代大规模集成电路技术,采用严格

    2025-09-18 12:15:45 公墓资讯 
  • 佳能SX120对比【佳能sd1200is好还是ixus 95ix好】

    使用相机21mm广角端可以拍摄广阔的全景焦距:4mm光圈:f/8.0ISO感光度:100使用相机1365mm长焦端可以记录远处的特写焦距:49mm光圈:f/5.

    2025-09-18 11:15:49 公墓资讯 
  • 深入解析以太网控制器:功能与应用全览

    以太网控制器早在1970年代就出现了。它们是Xerox发明的重要组成部分,以确保计算机网络性能。他们使用LAN基带连接标准。同时,在工作时,以太网控制器还将使用

    2025-09-18 11:15:39 公墓资讯 
  • ip地址分类 ip地址怎么判断a类b类c类

    1五类IP IPV4简单粗暴地把IP地址分为五类。分类方法如下图所示:也就是说,分为以下几类:A:0.0.0.0127.255.255,其中段0和127不可用

    2025-09-18 10:15:49 公墓资讯 
  • 微博快速增粉技巧解析

    1。通过搜索功能添加最直接的方法是通过微博上的搜索功能。用户可以在Weibo应用程序的“Discover”页面的搜索框中输入朋友的微博昵称,真实名称或相关关键字

    2025-09-18 09:16:20 公墓资讯