service的主要功能如下:

a. 执行需要长时间运行的操作,这个操作不与用户进行交互,如网络下载、大文件I/O、复杂计算。
b. 应用内或应用间数据通信,Android每个应用程序都在自己的dalvik虚拟机中运行,一个应用是不允许访问其他应用的内存信息的,为此 Android引入了Content Provider在不同应用间共享数据,BroadcastReceiver广播信息给不同应用程序,但Content Provider更多用于数据的共享,BroadcastReceiver广播的信息会被所有应用接收较耗费系统资源,对于两个应用间动态的进行交互还需要通过Service来完成。
首先,service的用途可分为:
1、单个运用程序内的服务
2、多个应用程序内的服务及通讯(注意:是多个应用程序内哦)‘
1、单个应用程序内的服务。分两种情况讨论:
1)、在Activity中调用startService(最普遍的使用方法),这种service无法与外界交互,即不能获取到service的相关属性与相关操作。
Service示例
public class MyService extends Service {
@Override
public void onCreate() {
super.onCreate();
Toast.makeText(this, "Service Create", Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroy() {
Toast.makeText(this, "Service Destroty", Toast.LENGTH_SHORT).show();
super.onDestroy();
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
Toast.makeText(this, "Service Start", Toast.LENGTH_SHORT).show();
return super.onStartCommand(intent, flags, startId);
}
}
在这种情况下,我们把大部分要做的工作都放在了onCreate或者onStartCommand当中。但是注意:这种service并没有单独开一个线程,仍然是主线程,所以,当在里面进行各种耗时操作时,会出现ANR(对Activity和BroadcastReceiver响应时间的限制(Activity对事件响应不超过5秒,BroadcastReceiver执行不超过10秒))。一般耗时操作最好在service中另开一个线程。
所以推荐使用IntentService,IntentService是重新开一个线程来处理需要完成的任务。
生命周期:通过startService启动服务,若服务未启动,会先执行onCreate函数(若服务已启动则不执行此函数),再执行onStartCommand函数。由此可知多次调用startService传入相同参数不会启动多个服务 (onStartCommand函数会执行多次),所以最终只需要调用一次stopService或stopSelf函数停止服务;我们可以将 service的处理逻辑放入onStartCommand函数中。服务一直运行,在程序退出后服务也不会停止,直到stopService或 stopSelf函数被调用,当然可能被系统回收。
对于onStartCommand的返回值,若返回START_STICKY表示服务通过显式调用启动或停止,若返回 START_NOT_STICKY orSTART_REDELIVER_INTENT表示服务仅在有请求发送过来处理时才处于运行状态。
使用场景:因为这种方式Service无法与外部进行方便的动态交互,所以适合做后台服务,如网络下载(用户通过Intent传入Url到Service,推荐使用IntentService).
2)、通过多bindService启动Service(动态交互的Service)
如果当个应用程序内有多个线程要与Service通讯时,我们可以使用bindService。使用这种方法,我们可以对Service内的属性进行操作和访问。
使用场景:应用内通信,如音乐播放器,在服务中控制播放器的播放、暂停、停止,在Activity中通过对服务操作控制播放器。
2、应用间进行通讯(这是不同应用间进行通讯哦)
1)、Using a Messenger:http://developer.android.com/guide/components/bound-services.html#Messenger
使用场景:当仅有2个应用要互相通讯时,我们使用Messenger类,而不使用AIDL的方式,
2)、AIDL
Android使用AIDL来完成进程间通信(IPC),AIDL全程为Android Interface Definition Language。在服务需要接受不同应用多线程的请求时才需要使用AIDL,如果是同一个应用内的请求使用Binder实现即可,见应用内交互的服务;如果只是应用间通信而不是多线程处理的话使用Messenger,当然这两种情况也可以使用AIDL。本地进程和远程进程使用AIDL有所不同,本地进程内调用时会都在调用的线程内执行,远程进程使用是通过Service进程内一个由系统维护的线程池发出调用,所以可能是未知线程同时调用,需要注意线程安全问题。
使用场景:当我们有多个客户端(应用程序)要与服务端进行通讯时,即在服务需要接受不同应用多线程的请求时才需要使用AIDL

android service 的各种用法(IPC、AIDL)相关推荐

  1. android同步服务启动,Android Service的基本用法(startService启动方式生命周期)

    概念:Service作为安卓的四大组件之一,并不像Activity一样,能够被我们看到.通常,它用于在后台为我们执行一些耗时,或者需要长时间执行的一些操作的.(可理解为没有界面的Activity) 使 ...

  2. Android Service和Binder、AIDL

    为什么80%的码农都做不了架构师?>>>    Android Service和Binder.AIDL 人收藏此文章, 关注此文章发表于3个月前 , 已有 206次阅读 共 个评论  ...

  3. 简单音乐播放实例的实现,Android Service AIDL 远程调用服务

    2019独角兽企业重金招聘Python工程师标准>>> Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remo ...

  4. Android Service学习之AIDL, Parcelable和远程服务

    AIDL的作用 由于每个应用程序都运行在自己的进程空间,并且可以从应用程序UI运行另一个服务进程,而且经常会在不同的进程间传递对象.在Android平台,一个进程通常不能访问另一个进程的内存空间,所以 ...

  5. Android Service AIDL 远程调用服务 【简单音乐播放实例】

    Android Service是分为两种: 本地服务(Local Service): 同一个apk内被调用 远程服务(Remote Service):被另一个apk调用 远程服务需要借助AIDL来完成 ...

  6. Android Service的onStartCommand返回值用法

    2019独角兽企业重金招聘Python工程师标准>>> Android Service的onStartCommand返回值用法 本文目的:使读者快速理解 1.START_STICKY ...

  7. 【Android】 Android Service生命周期及用法

    原文来自: 首先我们要知道Service具体是干什么的,什么时候用到?以及它的生命周期等. Service概念及用途: Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己 ...

  8. Android Service完全解析,关于服务你所需知道的一切(下)

    转载请注册出处:http://blog.csdn.net/guolin_blog/article/details/9797169 在上一篇文章中,我们学习了Android Service相关的许多重要 ...

  9. Android查缺补漏(IPC篇)-- 进程间通讯之Socket简介及示例

    本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8425736.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...

  10. Android中Parcelable接口用法

    --  通过writeToParcel将你的对象映射成Parcel对象,再通过createFromParcel将Parcel对象映射成你的对象.也可以将Parcel看成是一个流,通过writeToPa ...

最新文章

  1. [Swift通天遁地]九、拔剑吧-(9)创建支持缩放、移动、裁切的相机视图控制器
  2. 018_switch语句
  3. HDU5593 ZYB's Tree 树形DP +分治
  4. 【20171025中】alert(1) to win 脚本渲染自建
  5. 对于访问IIS元数据库失败的解决
  6. Jenkins分布式构建和部署(master-slave)
  7. 浅谈Android数据库DBFlow
  8. python分片上传_分片上传_分片上传_上传文件_Python_SDK 示例_对象存储 OSS - 阿里云...
  9. postgresql 中int4rang类型项目应用
  10. 面向对象程序设计——总结作业
  11. linux终端反引号怎么使用,Linux 反引号 的作用
  12. 2019年六项扣除 个税计算器
  13. 网关统一配置解决跨域问题
  14. java 导出word 含表格_poi 导出word,导出表格(复杂表格合并行列)解决方法
  15. 香农编码用matlab实验报告,信息论与编码实验指导书
  16. 12万游戏账号一夜被封杀
  17. 【DL笔记】LeNet5神经网络简介及TensorFlow实现
  18. 在fomc会议中建模主题趋势
  19. Office WORD里插入图片,嵌入型只能显示一半怎么办
  20. numpy python2_盘一盘 Python 系列 2 - NumPy (上)

热门文章

  1. python交互式换行_如何在Python中进行换行(换行)?
  2. 安装python3.7的步骤_如何在Debian 9上安装Python 3.7?
  3. 项目-字典-更新字典分组
  4. function传值传字符串,然后Ajax url传值的时候传这个装字符串的变量
  5. Redis设计思路学习与总结
  6. div contenteditable=true各个浏览器上的解析
  7. Tomcat的安装与配置
  8. sublime补齐标签的用法
  9. 我的PCB职业,请大家多指教!
  10. android动态加载assets,从android_assets文件夹动态加载dll