一.概述

通过学习本篇文章,你将学会:

1.什么是Service,后台服务以及两种启动方式的生命周期

2.什么是前台服务,有什么差别

3.什么是IntentService

4.什么是AIDL跨进程服务

5.有哪些系统服务我们可能会用到的

二.后台服务

我们知道Service也是安卓四大组件之一,我们可以把它理解为类似Activity但是又不同于Activity的一种载体,它是运行在后台不与用户直接进行交互的,没有用户界面的应用组件。服务可由其他应用组件启动(如Activity),服务一旦被启动将在后台一直运行,即使启动服务的组件(Activity)已销毁也不受影响。Service默认运行于UI线程中,因此,和Activity一样不要在Service上进行耗时操作,除非你开启子线程。Service基本上分为两种形式:

1.启动状态:当应用组件(如 Activity)通过调用 startService() 启动服务时,服务即处于“启动”状态。一旦启动,服务即可在后台无限期运行,即使启动服务的组件已被销毁也不受影响,除非手动调用才能停止服务, 已启动的服务通常是执行单一操作,而且不会将结果返回给调用方。启动和停止方法:

Intent intent=new Intent(this,MyService.class);
startService(intent);//启动
stopService(intent);//停止
生命周期:
onCreate--->onstartCommand--->onDestory

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

创建一个MyService继承Service,重写onBind()返回一个继承Binder的类。在activity中调用

Intent intent=new Intent(this,MyService.class);

bindService(intent, conn, Service.BIND_AUTO_CREATE);

这里最大的区别就在于conn,就是ServiceConnection,重写两个方法onServiceConnected和onServiceDisconnected,我们可以在onServiceConnected方法中获取绑定Service传递过来的IBinder对象,通过这个IBinder对象,实现宿主和Service的交互。调用unbindService(conn);解绑服务,生命周期:

onCreate--->onBind--->onUnBind--->onDestory

首先,我们看一下我们的服务:

再来看看我们的activity如何启动和关闭这两种状态:

启动状态

绑定状态

三.前台服务

在一般情况下,Service几乎都是在后台运行,一直默默地做着辛苦的工作。但这种情况下,后台运行的Service系统优先级相对较低,当系统内存不足时,在后台运行的Service就有可能被回收。如果我们希望Service可以一直保持运行状态且不会在内存不足的情况下被回收时,可以选择将需要保持运行的Service设置为前台服务。前台服务创建很简单,其实就在Service的基础上创建一个Notification,然后使用Service的startForeground()方法即可启动为前台服务。

在onDestory调用stopForeground(true);// 停止前台服务--参数:表示是否移除之前的通知

四.IntentService

IntentService是专门用来解决Service中不能执行耗时操作这一问题的,创建一个IntentService也很简单,只要继承IntentService并覆写onHandlerIntent函数,在该函数中就可以执行耗时操作了

五.AIDL跨进程服务

AIDL是Android中IPC(Inter-Process Communication)方式中的一种,AIDL是Android Interface definition language的缩写,AIDL的作用是让你可以在自己的APP里绑定一个其他APP的service,这样你的APP可以和其他APP交互。

APP一:我们把它理解为服务端,需要发送信息

我们先在main下创建aidl/aidl文件夹,创建MyAIDL的aidl文件,重新编译在generated ->source ->aidl->debug下会生成一个aidl文件,那说明AIDL文件已经编译成功。如图:

再创建我们的service,自定义的MyBinder继承MyAIDL.Stub,在onBinder返回MyBinder对象

然后在清淡文件添加该服务:

好了,基本上,我们的服务端工作就完成了。

APP二:我们把它理解为客户端,需要接受信息

我们复制一份一模一样的MyAIDL的aidl文件到项目相同的位置上,编译检测:

然后,我们需要绑定APP一中的服务,这里需要绑定隐士服务,创建conn,获取MyAIDL对象:

绑定和解绑服务:

当我们绑定服务则会输出:

这就实现了APP一向APP二传输数据

六.系统服务

系统服务提供了很多便捷服务,可以查询Wifi、网络状态、查询电量、查询音量、查询包名、查询Application信息等等等相关多的服务。

1. 判断Wifi是否开启

WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);                                               booleanenabled = wm.isWifiEnabled();

2. 获取系统最大音量

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);                                             intmax = am.getStreamMaxVolume(AudioManager.STREAM_SYSTEM);

3. 获取当前音量

AudioManager am = (AudioManager) getSystemService(AUDIO_SERVICE);                                         intcurrent = am.getStreamMaxVolume(AudioManager.STREAM_RING);

4. 判断网络是否有连接

ConnectivityManager cm = (ConnectivityManager)getSystemService(CONNECTIVITY_SERVICE); NetworkInfo info = cm.getActiveNetworkInfo();                                                                              booleanisAvailable = info.isAvailable();

七.总结

以上就是关于service的知识点,如有不足或者错误的地方,请指正。Service也是平时开发中常用的组件,不要忘记在清单文件中进行注册。不管怎样,代码的东西不只是需要多看,更需要通过自己动手去写去熟悉代码才能有更深的印象,更好更全面的了解。