作者:李波2602884584 | 来源:互联网 | 2023-08-28 17:04
前言:在学习Service过程中,看其他人的博客,讲的不怎么全,需要查看多人的博客才能弄明白。这篇文章是我个人总结。不正之处,还望大牛指正。写的比较浅,适合入门操作。一、Service
前言:在学习Service过程中,看其他人的博客,讲的不怎么全,需要查看多人的博客才能弄明白。这篇文章是我个人总结。不正之处,还望大牛指正。写的比较浅,适合入门操作。
一、Service是什么?
1、Service是android四大组件之一,没有前台界面,在后台运行。
2、Service运行在主线程,如果在Service中做很耗时操作,将会是程序ANR。
3、Service在后台处理一些耗时的操作(不能很耗时),或者执行一些长期运行的任务
二、Service的基本用法
1、继承Service类,重写Service的四个方法
onCreate()、onStartCommend()、onBind()、onDestory()
2、Service的启动方式
有两种启动方式 1、startService()和 bindService()
首先第一种:startService
经历的生命周期是onCreate() –> onStartCommand 服务开启,当用户调用stopService()方法时服务调用onDestory(),服务就被销毁。
注意:当一个服务已经被开启之后,用户再次调用startService时,生命周期就不会走onCreate(),只会调用onStartCommand方法。
所以在onCrate中做一些初始化操作,在onStartCommand做些业务类操作
第二种启动方式 bindService()
用户点击bindService之后,Service经历的生命周期为onCreate() –> onBind()那么Service就被启动了,用户调用unbindService(),Sevice调用 onUnbind()–> onDestory(),自此,服务就被销毁了
注意:如果用户同时调用了startService和bindService方法,那么,若是用户在销毁Service的时候只调用了stopService,那么service是不会调用onDestory()方法的,因为Service还有其他Activity的引用。也就是还和其他Activity绑定了,只有当调用unBindService时,Service才会调用onDestory();
三、Service跨进程通信(AIDL)
1、AIDL(Android Interface Definition Language)
android接口定义语言,解决跨进程通信,让多个应用程序共享一个Service。
2、Android studio上使用AIDL的方法
操作该方法之后会生成一个与java包同级的aidl包
之后会生成如下所示的路径
然后在文件中添加你需要的方法,然后build一下,生成如下的路径
新建一个Service类,在AndroidManifest.xml中注册Service,由于另一个进程不知道服务中的Service是什么名称,所以用隐式调用注册方式如下:
Service代码中添加如下代码:
重写onBind()方法,并返回mBinder
3、再新建一个项目,命名为AIDLClient
说明:需要使用AIDL,就必须将ServiceTest(我建的服务类项目命名为ServiceTest)项目中的AIDL文件
复制到AIDLCilent中,包括包名路径:
具体操作和在ServiceTest中新建AIDL方式一样,首先新建aidl包,然后再在改包下新建与ServiceTest一样的包名,然后再将ServiceTest中的
文件复制到AIDLClient中,build一下,aidl文件复制完成。
再在AIDLCilent的activity_main.xml文件中添加一个按钮,在MainActivity中添加如下代码:
注意:
Intent intent = new Intent("com.example.servicetest.IMyAidlInterface");
intent.setPackage("com.example.hhly_pc.servicetest");
bindService(intent, connection, BIND_AUTO_CREATE);
这三行代码中,若你没有加中间那行代码 intent.setPackage(“com.example.hhly_pc.servicetest”),若你适配的手机版本为android 5.0之前的,那么Service的隐式调用可以成功,若为5.0之后也就是从Lollipop开始,采用隐式调用,便会编译出错Service Intent must be explitict xxxx……解决办法是设置Service的包名即可。
参考文章:http://blog.csdn.net/guolin_blog/article/details/9797169,这篇文章是郭神讲解Service的,但是他用的是eclipse,有些方法也不适用于android Studio。
http://blog.csdn.net/zheng548/article/details/54605824 这篇文章写的是android studio创建AIDL的,但是还有些地方没讲明白。
http://www.2cto.com/kf/201604/502210.html 这篇文章和https://my.oschina.net/u/269663/blog/396826?fromerr=sm6neVzq这两篇文章讲的事解决android5.0之后Service无法隐式调用的办法。