博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
android service 的各种用法(IPC、AIDL)
阅读量:7103 次
发布时间:2019-06-28

本文共 2580 字,大约阅读时间需要 8 分钟。

http://my.oschina.net/mopidick/blog/132325

最近在学android service,感觉终于把service的各种使用场景和用到的技术整理得比较明白了,受益颇多,在此记录一下!

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:

使用场景:当仅有2个应用要互相通讯时,我们使用Messenger类,而不使用AIDL的方式,

2)、AIDL

Android使用AIDL来完成进程间通信(IPC),AIDL全程为Android Interface Definition Language。在服务需要接受不同应用多线程的请求时才需要使用AIDL,如果是同一个应用内的请求使用Binder实现即可,见应用内交互的服务;如果只是应用间通信而不是多线程处理的话使用Messenger,当然这两种情况也可以使用AIDL。本地进程和远程进程使用AIDL有所不同,本地进程内调用时会都在调用的线程内执行,远程进程使用是通过Service进程内一个由系统维护的线程池发出调用,所以可能是未知线程同时调用,需要注意线程安全问题。

使用场景:当我们有多个客户端(应用程序)要与服务端进行通讯时,即在服务需要接受不同应用多线程的请求时才需要使用AIDL。

所有相关代码及例子:

http://www.cnblogs.com/trinea/archive/2012/11/08/2701390.html http://www.cnblogs.com/trinea/archive/2012/11/08/2699856.html
你可能感兴趣的文章
DRDS分布式SQL引擎—执行计划介绍
查看>>
iOS中round/ceil/floorf函数的应用
查看>>
Go 学习笔记(12):map
查看>>
iOS 获取手机型号,XR,XS,MAX
查看>>
一文搞定并发面试题
查看>>
【git】前端使用git分支的开发流程
查看>>
222. Count Complete Tree Nodes
查看>>
ESMap+Html5+SpringBoot+FastDFS实现导航导购App
查看>>
Centos7下一键安装LNMP环境脚本
查看>>
vue-cli3环境变量与分环境打包
查看>>
用element的upload组件实现多图片上传和压缩
查看>>
在Linux Debian 8下部署基于PHP的Web项目。
查看>>
附实例!图解React的生命周期及执行顺序
查看>>
小程序瀑布流效果,解决左右两边高度差距过大的问题
查看>>
CentOS 7 更换 yum 源
查看>>
人工智能深度学习Caffe框架介绍,优秀的深度学习架构
查看>>
程序员编程10大哲理!血的教训,后人警惕!
查看>>
使用vue2+Axios遇到的一些坑
查看>>
解决 create-react-app IE 兼容性问题
查看>>
js数据结构-二叉树(二叉堆)
查看>>