`

当年他问我service,我是这样回答的

阅读更多

记得前几年刚从某A公司离职到某B公司面试的,面试的人问到了了很多点,就连有些比较基础的都问的比较细节。比如Activity.Service等等。

但是真的细节决定成败往往不注重细节就容易翻车

在这里要告诫大家会就是会,不会就是不会。不要说精通或者会一点点。不然你会被问懵逼的

把多年的面试经验整理成为了一份983的PDF含有从基础到进阶。含有BATJ.字节跳动面试专题,算法专题,高端技术专题,混合开发专题,java面试专题,Android,Java小知识,到性能优化.线程.View.OpenCV.NDK等应有尽有。还有辅之相关的视频+学习笔记


(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF或者互相交流
(VX:mm14525201314)

 

一.Service 的基本认识

1.1 Service 是什么?

Service(服务)是一个一种可以在后台执行长时间运行操作而没有用户界面的组件。它运行于 UI 线程,因此不能进行耗时的操作。

1.2 Service 和 和 Thread 的区别

Service 的运行是在 UI 线程当中的,是绝对绝对不能进行耗时操作的,而 Thread 开启的子线程则可以进行耗时操作,但是 Thread 开启的子线程是不能直接对 UI 进行操作的,否则极有可能发生直接让程序崩掉,这就是它们的区别。

二. 启动 Service 的 的2 种方式

2.1 startService() 方法开启 Service

步骤:

  • a.定义一个类继承 Service。
  • b.在 AndroidManifest.xml 文件中配置该 Service。
  • c.使用 Context 的 startService(Intent)方法启动该 Service。
  • d.不再使用该 Service 时,调用 Context stopService(Intent)方法停止该 Service。

2.2 bindService 方法开启 Service(Activity 与 Service 绑定)

步骤:

  • a.创建 BinderService服务端,继承自 Service 并在类中创建一个实现 IBinder 接口的实现
    实例对象并提供公共方法给客户端调用。
  • b.从 onBind()回调方法返回此 Binder 实例。
  • c.在客户端中,从 onServiceConnected 回调方法接收 Binder,并使用提供的方法调用绑定
    服务。

三.Service的生命周期

服务的生命周期有两种,因为服务可以跟 Activity 绑定起来,也可以不绑定,Activity和服务进行通信的话,是需要把服务和 Activity 进行绑定的。因此服务的生命周期分为未绑定 Activity 的和绑定 Activity 的。

没有绑定 Activity 的服务生命周期图:


绑定 Activity 的服务生命周期图:


1.通过 Intent 和 startService()方法启动了一个服务,接下来执行 onCreate()方法,首次创建服
务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或 onBind()之前)。如果服务已在运行,则不会调用此方法。

 

2.当另一个组件(如 Activity)通过调用 startService() 请求启动服务时,系统将调用此方法。一旦执行此方法,服务即会启动并可在后台无限期运行。 如果您实现此方法,则在服务工作完成后,需要由您通过调用 stopSelf() 或 stopService() 来停止服务。(如果您只想提供绑定,则无需实现此方法。)

3.服务开始处于运行状态。

4.某个操作导致服务停止,比如执行了方法 stopService(),那么服务接下来会执行onDestory()销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

5.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

6.通过 Intent 和 bindService()方法启动了一个服务,接下来会执行 onCreate()方法,首次创建服务时,系统将调用此方法来执行一次性设置程序(在调用 onStartCommand() 或onBind() 之前)。如果服务已在运行,则不会调用此方法。

7.当另一个组件想通过调用 bindService() 与服务绑定(例如执行 RPC)时,系统将调用此方法。在此方法的实现中,您必须通过返回 IBinder 提供一个接口,供客户端用来与服务
进行通信。请务必实现此方法,但如果您并不希望允许绑定,则应返回 null。

8.服务开始处于运行状态。成功与 Activity 绑定。

9.某个操作导致服务解除绑定,比如执行了方法 unbindService(),那么服务接下来会解除与
当前 Activity 的绑定。接下来服务将面临销毁。

10.服务执行 onDestory()方法被销毁。服务应该实现此方法来清理所有资源,如线程、注册的侦听器、接收器等。 这是服务接收的最后一个调用。

11.服务被完全销毁,下一步就是等待被垃圾回收器回收了。

关于服务,总结一下:

a. 被启动的服务的生命周期:
如果一个 Service 被某个 Activity 调用 Context.startService方法启动,那么不管是否有 Activity 使用 bindService 绑定或 unbindService 解除绑定到该
Service,该 Service 都在后台运行。如果一个 Service 被 startService方法多次启动,那么onCreate 方法只会调用一次,onStart 将会被调用多次(对应调用 startService 的次数),并且系统只会创建 Service 的一个实例(因此你应该知道只需要一次 stopService 调用)。该Service将会一直在后台运行,而不管对应程序的 Activity 是否在运行,直到被调用stopService,或自身的stopSelf 方法。当然如果系统资源不足,android 系统也可能结束服务。

b. 被绑定的服务的生命周期:
如果一个 Service 被某个 Activity 调用 Context.bindService方法绑定启动,不管调用 bindService 调用几次,onCreate 方法都只会调用一次,同时onStart 方法始终不会被调用。当连接建立之后,Service 将会一直运行,除非调用Context.unbindService 断开连接或者之前调用 bindService 的 Context 不存在了(如
Activity 被 finish 的时候),系统将会自动停止 Service,对应 onDestroy 将被调用。

c. 被启动又被绑定的服务的生命周期:
如果一个 Service 又被启动又被绑定,则该 Service将会一直在后台运行。并且不管如何调用,onCreate 始终只会调用一次,对应 startService调用多少次,Service 的 onStart 便会调用多少次。调用 unbindService 将不会停止 Service,而必须调用 stopService 或 Service 的 stopSelf 来停止服务。

d. 当服务被停止时清除服务:
当一个 Service 被终止
1、调用 stopService
2、调用stopSelf
3、不再有绑定的连接(没有被启动))时,onDestroy 方法将会被调用,在这里你应当做一些清除工作,如停止在 Service 中创建并运行的线程。

特别注意:
1、你应当知道在调用 bindService 绑定到 Service 的时候,你就应当保证在某处调用unbindService 解除绑定(尽管 Activity 被 finish 的时候绑定会自动解除,并且 Service 会自动停止);

2、你应当注意 使用 startService 启动服务之后,一定要使用 stopService 停止服务,不管你是否使用 bindService;

3、同时使用 startService 与 bindService 要注意到,Service 的终止,需要 unbindService与 stopService 同时调用,才能终止 Service,不管 startService 与 bindService 的调用顺序,如果先调用 unbindService 此时服务不会自动终止,再调用 stopService 之后服务才会停止,如果先调用 stopService 此时服务也不会终止,而再调用 unbindService 或者 之前调用 bindService 的 Context 不存在了(如 Activity 被 finish 的时候)之后服务才会自动停止;

4、当在旋转手机屏幕的时候,当手机屏幕在“横”“竖”变换时,此时如果你的 Activity如果会自动旋转的话,旋转其实是 Activity 的重新创建,因此旋转之前的使用 bindService
建立的连接便会断开(Context 不存在了),对应服务的生命周期与上述相同。

5、在 sdk 2.0 及其以后的版本中,对应的 onStart 已经被否决变为了 onStartCommand,不过之前的 onStart任然有效。这意味着,如果你开发的应用程序用的 sdk 为 2.0 及其
以后的版本,那么你应当使用 onStartCommand 而不是 onStart

请查看完整的PDF版
(更多完整项目下载。未完待续。源码。图文知识后续上传github。)
可以点击关于我联系我获取完整PDF
(VX:mm14525201314)

分享到:
评论

相关推荐

    Activity绑定Service(Kotlin)

    在Android应用开发中,Service是用于执行长时间运行操作的一个组件,而Activity是用户与应用交互的界面。将Activity与Service绑定是一种常见的通信方式,尤其在需要在后台运行任务且需要与用户界面保持交互时。本...

    Service 启动与停止

    Service是Android系统中的一个重要组件,它负责在后台执行长时间运行的操作,不依赖于用户界面。在Android应用开发中,理解Service的启动与停止机制对于创建高效、稳定的后台服务至关重要。 一、Service概述 ...

    ServiceDemo.zip

    3. **绑定Service**: 通过`bindService()`方法可以与Service建立连接,这样可以在Activity和Service之间进行交互。在`onBind()`方法中返回实现了`IBinder`接口的对象,用于数据交换。绑定服务通常用于短时间的交互,...

    android service 简单实例源代码

    在Android开发中,Service是四大组件之一,它在后台运行,不与用户界面直接交互,常用于执行长时间的任务,如播放音乐、网络通信等。本篇文章将深入解析"android service 简单实例源代码",帮助你理解如何在Android...

    ServiceNow 基础手册

    ServiceNow是当今流行的企业服务管理平台,它提供了一个集成的系统,允许用户在一个统一的界面中管理和自动化企业内部的各种工作流程。ServiceNow平台的基础手册涵盖了该平台的基本使用方法,包括如何导航、管理记录...

    Service mesh.pptx

    ServiceMesh(服务网格)概念在社区里头非常火,有人提出2018年是ServiceMesh年,还有人提出ServiceMesh是下一代的微服务架构基础。作为架构师,如果你现在还不了解ServiceMesh的话,是否感觉有点落伍了?那么到底什么...

    appWidget启动Service

    这样,其他组件可以通过`bindService()`方法绑定到Service,直接调用Service的方法。 - **Intent: 如果交互简单,可以通过发送意图(Intent)来通信。比如,AppWidget可以启动一个带有特定数据的Intent,Service在...

    activity service 数据交互

    在Android应用开发中,Activity和服务(Service)是两个核心组件,它们之间经常需要进行数据交互。Activity作为用户界面,提供与用户的交互,而Service则在后台执行长时间运行的任务,不依赖于用户界面。本篇文章将...

    Android防止service多次执行startCommand

    这样,即使有多个启动请求,也只有第一个能真正启动Service。 ```java // 在Service中 @Override public void onCreate() { super.onCreate(); IntentFilter filter = new IntentFilter(ACTION_SERVICE_STARTED);...

    service和acivity之间通信

    这样,当其他组件(如`Activity`)绑定到`Service`时,它们就能通过`Binder`接口访问`Service`的方法。 **建立`ServiceConnection`** 在`Activity`中,我们需要创建一个`ServiceConnection`实例,这个实例会在`...

    Android 多个service的action 相同冲突 验证demo

    例如,可以为每个Service指定一个唯一的Category,这样Intent就能同时包含ACTION和Category,从而避免冲突。 2. **使用不同的ACTION**:最直接的方法是为每个Service定义一个唯一的ACTION,确保ACTION字符串不会...

    Android-Service与Activity传值

    在Android应用开发中,`Service`和`Activity`是两个重要的组件。`Service`用于在后台执行长时间运行的任务,而`Activity`则负责用户界面交互。在某些场景下,我们可能需要在`Service`和`Activity`之间传递数据,比如...

    ServiceDemo

    `startForeground()`方法可以将服务置于前台状态,显示持续的通知,这样即使在用户不与应用交互的情况下,Service也能保持运行。 在AndroidManifest.xml文件中,别忘了注册你的Service,否则系统无法识别。注册...

    android_service.rar

    这样,即使应用被杀死,系统也会保持Service运行。 示例代码可能涵盖了这些概念,并提供了如何创建、启动、绑定Service,以及处理Intent和管理生命周期的实例。学习这些代码有助于理解Service的实际应用,加深对...

    用SQL语句解决Service Broker未启动的问题

    "解决 Service Broker 未启动的问题" Service Broker 是 SQL Server 中的一个组件,用于实现异步消息传递。它允许数据库管理员创建可靠的、可扩展的消息应用程序。但是,有时可能会遇到 Service Broker 未启动的...

    Service使用demo(Eclipse)

    在Android开发中,Service是四大组件之一,它用于在后台执行长时间运行的操作,即使用户界面关闭仍然可以继续工作。本示例"Service使用demo(Eclipse)"将深入讲解如何在Eclipse环境中集成并运用Service,同时结合...

    Android Service简单实例

    在Android应用开发中,Service是四大组件之一,用于在后台执行长时间运行的操作,即使用户界面关闭也能继续工作。本篇文章将深入探讨`startService`类型的Android Service,通过一个简单的实例来展示其工作原理和...

    android多个activity和一个service通信

    在Android应用开发中,Activity和Service是两个关键组件。Activity代表用户界面,而Service则用于在后台执行长时间运行的任务,不直接与用户交互。在实际项目中,常常需要多个Activity与一个Service进行通信,比如本...

    Android 双进程守护service

    它是利用系统的漏洞来启动一个前台的Service进程,与普通的启动方式区别在于,它不会在系统通知栏处出现一个Notification,看起来就如同运行着...反正我是信了,demo在此,欢迎指正,很少写博客,就这样吧~~~~~~~忙去了

Global site tag (gtag.js) - Google Analytics