文章背景
Latest,项目中用到一个第三方的下载库,下载么,少不了service
的支持;正是由于这个service
是第三方库中的,所以有那么一点不可控的因素;当app启动了下载功能,这时候通过最近任务里列表(Recent Applications List)划掉的话,就会发现流量监控还会有大幅流量流失,打开正在运行的程序里还可以看到刚刚打开的app,发现下载的service
又重新起来了,或者说直接没有杀死。
问题原因
首先,回顾一下service
的知识。
service按照运行类型可以分为两类
- 前台服务
特点:会在通知一栏显示 ONGOING 的 Notification
应用:当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。 - 后台服务
特点: 默认的服务即为后台服务,即不会在通知一栏显示 ONGOING 的 Notification。
应用: 当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。
service按照运行地点可以分为两类
- 本地服务(Local)
区别:该服务依附在主进程上
优点: 服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC,也不需要AIDL。相应bindService会方便很多。
缺点: 主进程被Kill后,服务便会终止。
应用:当服务被终止的时候,通知一栏的 Notification 也会消失,这样对于用户有一定的通知作用。常见的如音乐播放服务。 - 远程服务(Remote)
区别: 该服务是独立的进程
优点: 服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符串。由于是独立的进程,因此在Activity所在进程被Kill的时候,该服务依然在运行,不受其他进程影响,有利于为多个进程提供服务具有较高的灵活性。
缺点: 该服务是独立的进程,会占用一定资源,并且使用AIDL进行IPC稍微麻烦一点。
应用: 当服务被终止的时候,用户是看不到效果的。某些不需要运行或终止提示的服务,如天气更新,日期同步,邮件同步等。
项目中的问题
遇到问题之后分析了一下 ,并且看了一下下载库的源码和配置文件,发现使用的远程的service
,这下子问题的原因就明确了。
-
解决问题
- 改变
service
的类型
如果是我们自己的程序是很好解决的,改一下service
的配置就好。可是第三方的库,除了作者留出接口或者配置文件,貌似看起来我们无能为力。辛好我们有源码,感谢作者。 - 编译源码Library---->jar包
library目录下的buidle.gradle添加:
//task to delete the old jar task deleteOldJar(type: Delete) { delete 'release/YourName.jar' } //task to export contents as jar task exportJar(type: Copy) { from('build/intermediates/bundles/release/') into('release/') include('classes.jar') ///Rename the jar rename('classes.jar', 'YourName.jar') } exportJar.dependsOn(deleteOldJar, build)
- 改变
-
- 按下图操作
![Android Studio Gudie](http://upload-images.jianshu.io/upload_images/79771-0b49e1e5fc52aa56.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 然后点击`other`里面的exportJar
![jar](http://upload-images.jianshu.io/upload_images/79771-d309bcbd40b3e841.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 看到任务台打印
![get the jar](http://upload-images.jianshu.io/upload_images/79771-99a0f8293e6881e9.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
- 最后,在你上一步指定的目录中就可以得到你的jar
- 问题 OK
由于我主要使用的Library的Service,所以还要在项目中的配置文件中声明:
<application>
...
<service android:name="com.xxxxxx.xxxxxx.xxxxxService$SharedMainProcessService" />
<service
android:name="com.xxxxxx.xxxxxx.services.xxxxxService$SeparateProcessService"
~~android:process=":filedownloader" ~~/>
...
</application>