android service 的各种用法(IPC、AIDL)

  次阅读 作者:智能小宝 来源:互联网 2016-01-13 21:53 我要评论(0)

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的方式,

本站文章信息来源于网络以及网友投稿,本站只负责对文章进行整理、排版、编辑,是出于传递更多信息之目的,并不意味着赞同其观点或证实其内容的真实性。如果您有什么意见或建议,请联系QQ28-1688-302!

人工智能实验室
相关文章相关文章
  • 未来两年人工智能要怎么走?看这篇就够了

    未来两年人工智能要怎么走?看这篇就够了

  • 无人驾驶汽车如何改变城市生活?听听他们怎么说

    无人驾驶汽车如何改变城市生活?听听他们怎么说

  • 韩春雨称已能重复实验结果 近期将有消息公布

    韩春雨称已能重复实验结果 近期将有消息公布

  • 英国研发“杀生”机器人 通过生命体获取能量

    英国研发“杀生”机器人 通过生命体获取能量

网友点评网友点评
阅读推荐阅读推荐

据国外媒体报道,在过去两年内,聊天机器人(chatbot)、人工智能以及机器学习的研发和采用取得了巨大进展。许多初创公司正利用人工智能和...

霍金 视觉中国 图 英国著名物理学家霍金(Stephen Hawking)再次就人工智能(AI)发声,他认为:对于人类来说,强大AI的出现可能是最美妙的...

文|郑娟娟 今年,人工智能(AI) 60岁了。在AI60岁的时候,笔者想要介绍一下AI100,一个刚刚2岁的研究项目,但它的预设寿命是100年,甚至更长...

AlphaGo与李世石的人机大战,为大众迅速普及了人工智能的概念。 但对谷歌而言,除了下围棋,现在的人工智能进展到哪一步了?未来,人工智能...