写点什么

Android 题集四大组件之 Service

用户头像
Android架构
关注
发布于: 1 小时前

3、使用 Context 的 startService(Intent)方法启动该 Service


4、不再使用时使用 stopService(Intent)方法停止该服务


每次通过 startService(Intent)方法启动 Service 时都会调用。其中我们可以注意 onStartCommand 是有返回值的。


  • START_STICKY:如果 service 进程被 kill 掉,保留 service 的状态为开始状态,但不保留递送的 intent 对象。随后系统会尝试重新创建 service,由于服务状态为开始状态,所以创建服务后一定会调用 onStartCommand(Intent,int,int)方法。如果在此期间没有任何启动命令被传递到 service,那么参数 Intent 将为 null。

  • START_NOT_STICKY:“非粘性的”。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统不会自动重启该服务。

  • START_REDELIVER_INTENT:重传 Intent。使用这个返回值时,如果在执行完 onStartCommand 后,服务被异常 kill 掉,系统会自动重启该服务,并将 Intent 的值传入。

  • START_STICKY_COMPATIBILITY:START_STICKY 的兼容版本,但不保证服务被 kill 后一定能重启。

  • OnDestroy:在 Service 销毁时调用,可在此回收一些资源。



在 bindService 中


步骤:


1、定义一个类继承 Service,创建一个继承与 Binder 的实例对象,并提供公共方法供客户端调用。


2、实现 onBind()方法,返回 Binder 实例


3、在 Manifest.xml 文件中配置该 Service


4、在客户端中,实现 ServiceConnection 实例,从 onServiceConnected()回调方法接收 Binder,并使用 bindService 绑定服务。


注:onServiceDiscounnection 方法是在服务崩溃或者服务杀死导致的连接中断时调用


首先会调用 onCreate,然后调用 onBind 方法,然后在 Activity 与 Service 解绑时调用 Unbind 方法,最后在所有 Activity 与 Service 解绑后,该 Service 会销毁,并调用 onDestroy 方法。 onBind:绑定服务才会调用,但注意即使我们用 startService 也要实现该方法。


一个 Service 可以被多个客户进行绑定,只有所有的绑定对象都执行了 onBind()方法后该 Service 才会销毁,不过如果有一个客户执行了 onStart()方法,那么这个时候如果所有的 bind 客户都执行了 unBind()该 Service 也不会销毁。



混合使用


在这之前,要知道一个原则是 Service 的 onCreate 的方法只会被调用一次,就是你无论多少次的 startService 又 bindService,Service 只被创建一次。


  • 如果先是 bind 了,那么 start 的时候就直接运行 Service 的 onStart 方法,如果先是 start,那么 bind 的时候就直接运行 onBind 方法。

  • 如果 service 运行期间调用了 bindService,这时候再调用 stopService 的话,service 是不会调用 onDestroy 方法的,service 就 stop 不掉了,只能调用 UnbindService, service 就会被销毁

  • 如果一个 service 通过 startService 被 start 之后,多次调用 startService 的话,service 会多次调用 onStart 方法。多次调用 stopService 的话,service 只会调用一次 onDestroyed 方法。

  • 如果一个 service 通过 bindService 被 start 之后,多次调用 bindService 的话,service 只会调用一次 onBind 方法。多次调用 unbindService 的话会抛出异常。


混合使用时的生命周期



Service 中可以弹 Toast 吗?




可以,弹吐司有个条件就是得有一个 Context 上下文,而 Service 本身就是 Context 的子类,因此在 Service 里面弹吐司是完全可以的。


如何在 service 中执行网络操作?




可以直接在 Service 中 onStartCommand()方法中可以执行网络操作,service 里面不能执行耗时的操作(网络请求,拷贝数据库,大文件 ),如果需要在服务中进行耗时操作,可以选择 IntentService, IntentService 是 Service 的子类,用来处理异步请求。


什么是 IntentService?




IntentService 是 Service 的子类,比普通的 Service 增加了额外的功能。


  • Service 不会专门启动一条单独的进程,Service 与它所在应用位于同一个进程中;

  • Service 也不是专门一条新线程,因此不应该在 Service 中直接处理耗时的任务;


IntentService 的特征


  • 会创建独立的 worker 线程来处理所有的 Intent 请求;

  • 会创建独立的 worker 线程来处理 onHandleIntent()方法实现的代码,无需处理多线程问题;

  • 所有请求处理完成后,IntentService 会自动停止,无需调用 stopSelf()方法停止 Service;

  • 为 Service 的 onBind()提供默认实现,返回 null;

  • 为 Service 的 onStartCommand 提供默认实现,将请求 Intent 添加到队列中;


Service 和 Activity 在同一个线程吗?




在一个 app 的情况下,默认是在同一个线程中的,main Thread (UI Thread)。


Service 和 Thread 的区别?




Thread 是程序运行的最小单元——线程。


Service 是安卓的一种机制,运行在主线程,因此在 Service 中进行耗时操作也需要开启新的线程。 那为什么还要 Service 不在 Activity 中直接操作 Thread 呢? 因为 activity 很难对 Thread 进行管理,当 activity 销毁了,之后的 activity 就没办法获取到之前创建的 Thread。


如何提高 service 的优先级?




进程的重要性依次是:前台进程、可见进程、服务进程、后台进程、空进程。所以销毁的顺序为逆方向。


  • 在 AndroidManifest.xml 文件中对于 intent-filter 可以通过 android:priority = “1000”这个属性设置最高优先级,1000 是最高值,如果数字越小则优先级越低,同时实用于广播。

  • 在 onStartCommand 里面调用 startForeground()方法把 Service 提升为前台进程级别,然后再 onDestroy 里面要记得调用 stopForeground ()方法。

  • onStartCommand 方法,手动返回 START_STICKY。

  • 在 onDestroy 方法里发广播重启 service。


service +broadcast 方式,就是当 service 走 ondestory 的时候,发送一个自定义的广播,当收到广播的时候,重新启动 service。(第三方应用或是在 setting 里-应用-强制停止时,APP 进程就直接被干掉了,onDestroy 方法都进不来,所以无法保证会执行)


  • 监听系统广播判断 Service 状态。 通过系统的一些广播,比如:手机重启、界面唤醒、应用状态改变等等监听并捕获到,然后判断我们的 Service 是否还存活。

  • Application 加上 Persistent 属性。


Activity、Intent、Service 是什么关系?




《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码




他们都是 Android 开发中使用频率最高的类。其中 Activity 和 Service 都是 Android 四大组件之一。都是 Context 类的子类 ContextWrapper 的子类, 因此他俩可以算是兄弟关系吧。不过兄弟俩各有各自的本领,Activity 负责用户界面的显示和交互,Service 负责后台任务的处理。Activity 和 Service 之间可 以通过 Intent 传递数据,因此可以把 Intent 看作是通信使者。


ActivityManagerService 了解吗?有什么作用?




ActivityManagerService 是 Android 中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块类似;

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
Android题集四大组件之Service