Android Service知识
创始人
2024-05-29 14:31:33
0

一. 概览

        Service 是一种可在后台执行长时间运行操作而不提供界面的应用组件。服务可由其他应用组件启动,而且即使用户切换到其他应用,服务仍将在后台继续运行。此外,组件可通过绑定到服务与之进行交互,甚至是执行进程间通信 (IPC)。例如,服务可在后台处理网络事务、播放音乐,执行文件 I/O 或与内容提供程序进行交互.

        本篇文章,我们重点讲一讲绑定服务.  为后面写的理解进程间通信机制文章做个铺垫.

二. 服务类型

2.1 前台服务

前台服务执行一些用户能注意到的操作。例如,音频应用会使用前台服务来播放音频曲目。前台服务必须显示通知。即使用户停止与应用的交互,前台服务仍会继续运行。

2.2 后台服务

后台服务执行用户不会直接注意到的操作。例如,如果应用使用某个服务来进行数据搜集上报,则此服务通常是后台服务。

2.3  绑定服务

当应用组件通过调用 bindService() 绑定到服务时,服务即处于绑定状态。绑定服务会提供客户端-服务器接口,以便组件与服务进行交互、发送请求、接收结果,甚至是利用进程间通信 (IPC) 跨进程执行这些操作。仅当与另一个应用组件绑定时,绑定服务才会运行。多个组件可同时绑定到该服务,但全部取消绑定后,该服务即会被销毁

三. 基础知识

        如要创建服务,您必须创建 Service 的子类(或使用它的一个现有子类)。在实现中,您必须重写一些回调方法,从而处理服务生命周期的某些关键方面,并提供一种机制将组件绑定到服务(如适用)。以下是你应该重写的最重要的回调方法:

onStartCommand()
当另一个组件(如 Activity)请求启动服务时,系统会通过调用 startService() 来调用此方法。执行此方法时,服务即会启动并可在后台无限期运行

如果您实现此方法,则在服务工作完成后,需负责通过调用 stopSelf() 或 stopService() 来停止服务。

onBind()

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

如果组件通过调用 startService() 启动服务(这会引起对 onStartCommand() 的调用),则服务会一直运行,直到其使用 stopSelf() 自行停止运行,或由其他组件通过调用 stopService() 将其停止为止。

[注意]: 如果通过startService()已经启动了一个服务,再通过startService()方法启动的时候,  只会走onStartCommand()方法,不会重新走onCreate()方法. 

四. 创建绑定服务

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

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

[要点]:

如要创建绑定服务,您需通过实现 onBind() 回调方法返回 IBinder,从而定义与服务进行通信的接口;

1. 必须定义指定客户端如何与服务进行通信的接口

2. 服务与客户端之间的这个接口必须是 IBinder 的实现,并且服务端必须从 onBind() 回调方法返回该接口。

3. 收到 IBinder 后,客户端便可开始通过该接口与服务端进行交互。

多个客户端可以同时绑定到服务。完成与服务的交互后,客户端会通过调用 unbindService() 来取消绑定。如果没有绑定到服务的客户端,则系统会销毁该服务。

等同于下面这句话的理解:

多个客户端可以绑定到相同服务,而且当所有绑定全部取消后,系统即会销毁该服务(服务不必自行停止运行).


五. 服务生命周期


  

六. 实践出真知

本篇文章重点只讲绑定本地服务, 在同一个进程间通信

如果您的服务仅供本地应用使用,且无需跨进程工作,您可以实现自有 Binder 类,让客户端通过该类直接访问服务中的公共方法。

注意:只有当客户端和服务处于同一应用和进程内(最常见的情况)时,此方式才有效。例如,对于需要将 Activity 绑定到在后台播放音乐的自有服务的音乐应用,此方式非常有效。

实现步骤:

1. 在你的服务中,创建可执行以下某种操作的 Binder 实例:
     包含客户端可调用的公共方法。
     返回当前的 Service 实例,该实例中包含客户端可调用的公共方法。
     返回由服务承载的其他类的实例,其中包含客户端可调用的公共方法。

2. 从 onBind() 回调方法返回此 Binder 实例。

3. 在客户端中,从 onServiceConnected() 回调方法接收 Binder,并使用提供的方法调用绑定服务。

客户端代码

public class LocalClient extends AppCompatActivity {private Intent intent;//同一进程, 本地服务对象LocalService mService;//是否绑定成功boolean mBound = false;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);intent = new Intent(this, LocalService.class);Button btn = (Button)findViewById(R.id.start_btn);btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if(mBound) {int num = mService.getRandomNumber();Toast.makeText(LocalClient.this, "number: " + num, Toast.LENGTH_SHORT).show();}}});}private ServiceConnection connection = new ServiceConnection() {@Overridepublic void onServiceConnected(ComponentName componentName, IBinder service) {Log.e("test", "===客户端===onServiceConnected======");mBound = true;//已经绑定到LocalService,强制转换IBinder并获取LocalService实例LocalService.LocalBinder binder = (LocalService.LocalBinder) service;mService = binder.getService();}@Overridepublic void onServiceDisconnected(ComponentName componentName) {Log.e("test", "====onServiceDisconnected=====");mBound = false;}};//在onstart方法中 调用 bindservice 绑定服务@Overrideprotected void onStart() {super.onStart();bindService(intent, connection, Context.BIND_AUTO_CREATE);}//在onstop方法中, 调用unbindservice 解绑服务@Overrideprotected void onStop() {super.onStop();unbindService(connection);mBound = false;}@Overrideprotected void onDestroy() {super.onDestroy();}

本地服务端的代码:

public class LocalService extends Service {// Binder given to clientsprivate final IBinder binder = new LocalBinder();// Random number generatorprivate final Random mGenerator = new Random();public LocalService() {}/** method for clients */public int getRandomNumber() {return mGenerator.nextInt(100);}/*** Class used for the client Binder.  Because we know this service always* runs in the same process as its clients, we don't need to deal with IPC.* 用于客户端的Binder类。因为我们知道该服务总是在与其客户端相同的进程中运行,所以我们不需要处理IPC。*/class LocalBinder extends Binder {LocalService getService() {// Return this instance of LocalService so clients can call public methodsreturn LocalService.this;}}@Overridepublic IBinder onBind(Intent intent) {Log.e("test", "====LocalService  onBind====绑定服务回调===");return binder;}@Overridepublic boolean onUnbind(Intent intent) {Log.e("test", "====LocalService  onUnbind===解绑服务回调==");return super.onUnbind(intent);}

打开app界面后,打印log:

03-06 15:16:16.612 19858 19858 E test    : ====LocalService  onBind====绑定服务回调=
03-06 15:16:16.623 19858 19858 E test    : ===客户端===onServiceConnected======

客户端通过bindservice 绑定服务, 打印'===LocalService  onBind===='然后服务端通过onBind()回调方法返回此Binder实例

在客户端中从 onServiceConnected() 回调方法接收 Binder对象,打印"客户端===onServiceConnected===="

退出app界面后, 解绑服务,打印log:

03-06 15:22:52.460 19858 19858 E test    : ====LocalService  onUnbind===解绑服务回调==


 

相关内容

热门资讯

今天,宜爬“山”! 转自:珠海发布大家都说,父爱如山,母爱又何尝不是!它以山的姿态站在我们的人生坐标里,它用山的沉默垒出...
汽车车门把手将迎来国家标准,释... 转自:新华网  新华社北京5月10日电 题:汽车车门把手将迎来国家标准,释放什么信号?  新华社记者...
10日付费短剧热度大盘5650... 来源:新腕儿今天发布的是昨天(5月10日)短剧付费大盘日榜,整体大盘热度值为5650万。特别声明:以...
漂泊 53 年,苏联金星探测器... IT之家 5 月 11 日消息,俄罗斯国家航天集团宣布,近地空间危险情况自动预警系统监测显示,宇宙-...
加州州长再就关税批评特朗普政府 转自:海客新闻 【#加州州长再就关税批评特朗普政府#】#...
都有数|玩儿着就能挣钱?国家认... 转自:北京日报客户端人社部日前公示拟新增无人机群飞行规划员、装修管家等17个新职业,以及黄金鉴定估价...
我爱你,不止今天! 咿呀学语时当我第一次模糊地喊出“妈妈”你尚且青涩的眼眸中亮起柔软的光长大离家后一声“妈妈”成了电话里...
焦点访谈 | 突围拓展多元市场... 来源:央视网 央视网消息(焦点访谈):当前我国的外贸行业正面临前所未有的挑战。美国肆意挥舞关税大棒,...
雨水按下暂停键 阳光重返天气舞...     昨日19时许,南宁城区迎来降雨,体感稍凉。    本报记者宋延康 摄  本报讯(记者赵金玲)...
科普大篷车进乡村 科技体验零距...     科技辅导员为学生讲授科技知识。    本报通讯员肖重虎 摄  本报讯(记者凌剑伊 通讯员蒙蓓...
镇江人才吸引力升至全国37位 金山网讯 5月9日,智联招聘旗下专业研究机构智联研究院联合“泽平宏观”正式发布《中国城市人才吸引力排...
【加快落实“五大任务” 推动高... 来源:内蒙古新闻网-《内蒙古日报  5月7日,在位于乌兰察布市四子王旗忽鸡图乡小东营村灌木林退化修复...
时政微纪录丨习主席的俄罗斯时间 来源:央视新闻客户端 应俄罗斯联邦总统普京邀请,国家主席...
常见故障100%识别 我国货运... 记者今天(11日)从国家能源集团获悉,我国货运铁路首套智能巡检机器人在河北沧州投用,这对促进我国铁路...
中共太原市委组织部公示 现对市委研究拟任职干部予以公示。郭强,男,汉族,1981年10月生,在职大学,中共党员,现任太原物产...
苏丹一州首府遭无人机袭击,20... 苏丹政府当地时间10日说,苏丹北科尔多凡州首府欧拜伊德市当天遭无人机袭击,造成20名囚犯死亡。苏丹文...
陈钧书画金石题跋艺术作品展在铜...   本报讯 (记者 吴洋凯)5月7日,由铜川书画院主办,铜川书画公园文化艺术有限公司承办的“砚耕四十...
花季少女被限制高消费,原因竟然... 转自:上观新闻2024年的夏天,大一学生小赵攥着身份证站在高铁站售票厅,屏幕上“无法购买高铁票”的提...
新职业新工种,开启无限可能! 转自:新华网 早上叫醒你的不是闹钟,可能是睡眠健康管理师...
政策一经出台,便在金融市场激起... 2025 年 5 月 7 日,中国人民银行今日向市场释放重磅政策组合拳。潘功胜行长在国务院新闻办发布...