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

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

service的主要功能以下:java

a. 执行须要长时间运行的操做,这个操做不与用户进行交互,如网络下载、大文件I/O、复杂计算。android

b. 应用内或应用间数据通讯,Android每一个应用程序都在本身的dalvik虚拟机中运行,一个应用是不容许访问其余应用的内存信息的,为此Android引入了Content Provider在不一样应用间共享数据,BroadcastReceiver广播信息给不一样应用程序,但Content Provider更多用于数据的共享,BroadcastReceiver广播的信息会被全部应用接收较耗费系统资源,对于两个应用间动态的进行交互还须要经过Service来完成。安全

首先,service的用途可分为: 一、单个运用程序内的服务 二、多个应用程序内的服务及通信(注意:是多个应用程序内哦)‘网络

一、单个应用程序内的服务。分两种状况讨论:多线程

1)、在Activity中调用startService(最广泛的使用方法),这种service没法与外界交互,即不能获取到service的相关属性与相关操做。 Service示例ide

<!-- lang: java -->
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是从新开一个线程来处理须要完成的任务。ui

生命周期:经过startService启动服务,若服务未启动,会先执行onCreate函数(若服务已启动则不执行此函数),再执行onStartCommand函数。由此可知屡次调用startService传入相同参数不会启动多个服务(onStartCommand函数会执行屡次),因此最终只须要调用一次stopService或stopSelf函数中止服务;咱们能够将service的处理逻辑放入onStartCommand函数中。服务一直运行,在程序退出后服务也不会中止,直到stopService或stopSelf函数被调用,固然可能被系统回收。this

对于onStartCommand的返回值,若返回START_STICKY表示服务经过显式调用启动或中止,若返回START_NOT_STICKY orSTART_REDELIVER_INTENT表示服务仅在有请求发送过来处理时才处于运行状态。

使用场景:由于这种方式Service没法与外部进行方便的动态交互,因此适合作后台服务,如网络下载(用户经过Intent传入Url到Service,推荐使用IntentService).

2)、经过多bindService启动Service(动态交互的Service)

若是当个应用程序内有多个线程要与Service通信时,咱们可使用bindService。使用这种方法,咱们能够对Service内的属性进行操做和访问。

使用场景:应用内通讯,如音乐播放器,在服务中控制播放器的播放、暂停、中止,在Activity中经过对服务操做控制播放器。

二、应用间进行通信(这是不一样应用间进行通信哦)

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。

全部相关代码及例子:

http://www.cnblogs.com/trinea/archive/2012/11/08/2701390.html
http://www.cnblogs.com/trinea/archive/2012/11/08/2699856.html
相关文章
相关标签/搜索