搜索
您的当前位置:首页正文

Service以及如何将 Library 项目打包成jar文件

来源:知库网
  • 文章背景
    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   
    - 然后点击`other`里面的exportJar  
      
    - 看到任务台打印  
    ![get the   
    - 最后,在你上一步指定的目录中就可以得到你的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>

Top