一.概述
通过学习本篇文章,你将学会:
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也是平时开发中常用的组件,不要忘记在清单文件中进行注册。不管怎样,代码的东西不只是需要多看,更需要通过自己动手去写去熟悉代码才能有更深的印象,更好更全面的了解。