Android Bound Service(一) ----- Extending Binder Service(进程内绑定Service的简单例子)

ref:http://developer.android.com/guide/components/bound-services.html?

前言

重新学习这一项技术,主要的原因,是因为以前没有好好的学,那时总觉得作品能动,能完成工作就好了,而这种得过且过的想法,大大地影响了我的技术程度,也因此,在这个这个博客里,有许多的复习心得。有幸得到一位前辈的指导,指出,若只是学习,而无实际应用,这样进步会较少,因此,最好要多看源码,并且自己多尝试多实践,这样学习一万小时,应该能有小进步,因此开始了 Bound Service相关学习/复习工作。

Bound Service

「Bound Service是 Client-Server Interface 中的服务端,一个 Activity 可以透过 Bound Service 绑定一个服务,收发讯息,甚至进行进程间通讯。」Service类是一个 Abstract Class,而 Bound Service实现了 Service类,并实现了 onBind()方法,Activity 才能和 Service进行沟通。 所以,我们先从简单的例子--让一个 Activity 绑定一个 Service,让 Service 能够为 Activity
提供服务,同时,我已将练习的相关代码提交至 GitHub上(https://github.com/shanwu/InterProcessCommPractice),有不同的分枝分别代表不同的例子,这样可以使用 Github上的分枝比较功能()比较不同方法间的差异。

master 分枝:进程内通讯,代表的是官网 Extending the Binder class的例子。

ipc_messanger_example:跨进程通讯,代表的是官网 Using a Messenger的例子(抱歉 branch 名英文拼错 Orz)

ipc_messenger_example_bidirection:同上,但是其为 Service, Activity 双向互传的例子。

ipc_aidl_example:跨进程通讯,简单的 aidl 使用例子。

Extending Binder Service

客户端的 Activity 可以透过呼叫 bindService()方法和服务端的 Service建立连结,连结建立的时候,会先调用 Bound Service的 onBind() 方法,再来调用 onServiceConnected(),而如果是需要移除连结的话,便调用 unbindService()方法,此时Bound Service会直接调用 onDestory(),然後服务结束。代码如下:

在Bound Service写一个继承 Binder的类-LocalBinder,主要是在进程内通讯时,在 onBind()的时候,能够用方法来返回 Bound Service的对象:

    public class LocalBinder extends Binder {
        public Service getService() {
            return WorkerService.this;
        }
    }

宣告一个 LocalBinder的私有全局变量

public class WorkerService extends Service {
    private final IBinder mBinder = new LocalBinder();

同时覆写 onBind()方法

    @Override
    public IBinder onBind(Intent intent) {
        Log.d("guang","onBind");
        return mBinder;
    }

而在Activity端,我们需要使用 bindService()来进行绑定 Bound Service的工作

    @Override
    public void onClick(View v) {
        final int id = v.getId();
        switch (id) {
            case R.id.btn_start:
                Intent intent = new Intent(MainActivity.this, WorkerService.class);
                bindService(intent, mServiceConn, Context.BIND_AUTO_CREATE);
                break;

同时我们需要将接口 ServiceConnection的方法覆写,在连结开始的时候,iBinder便是onBind所返回的 IBinder类变量,所以我们将它强转为LocalBinder,然後调用LocalBinder里的方法以取得 Bound Service 的对象,将它在於全局变量中,之後便可以调用他的方法。这边要注意的是 onServiceDisconnected一般情况下不会调用,只有在 Service发生异常导致连结结束才会调用。

        mServiceConn = new ServiceConnection() {
            @Override
            public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
                WorkerService.LocalBinder lBinder = (WorkerService.LocalBinder) iBinder;
                mService = (WorkerService) lBinder.getService();
                Log.d("guang","onServiceConnected");
                mIsBind = true;
            }

            @Override
            public void onServiceDisconnected(ComponentName componentName) {
                Log.d("guang","onServiceDisconnected");
                mIsBind = false;
            }
        };

调用它的方法,使 Bound Service 做事,它可以是播放音乐,或是执行其它不需要 UI 界面的工作。

            case R.id.btn_sing:
                if (mIsBind) {
                    mService.makeSingingService();
                }
                break;

这样基本上就是本篇的重点了~全部代码均可自 GitHub取得~

时间: 2024-10-08 10:44:58

Android Bound Service(一) ----- Extending Binder Service(进程内绑定Service的简单例子)的相关文章

Android Service组件在进程内绑定(bindService)过程

本文参考Android应用程序绑定服务(bindService)的过程源代码分析http://blog.csdn.net/luoshengyang/article/details/6745181和<Android系统源代码情景分析>,作者罗升阳 一.Android Service组件在进程内绑定(bindService)过程 0.总图流程图如下: 1.Counter和CounterService所在应用程序主线程向ActivityManagerService进程发送BIND_SERVICE_T

跨进程绑定Service

之前讲过Service有远程服务,也就是不同程序之间也可以通过Service联系起来.跨进程的绑定Service可以通过aidl接口实现. 下面运用一个例子程序 提供Service里的方法和数据的程序叫做服务端,获取和运用Service里的方法和数据的程序叫客户端. 先创建两个安卓程序,一个作为服务端,一个作为客户端. 先对服务端进行操作,在服务端创建一个class类,然后在我的电脑的eclipse的项目存储目录下,找到该class并把后缀名改为 .aidl 然后回到开发程序中刷新一下,就会发现

保持Service不被Kill掉的方法--双Service守护 &amp;&amp; Android实现双进程守护

本文分为两个部分,第一部分为双Service守护,第二部分为双进程守护 第一部分: 一.Service简介:Java.lang.Object ?Android.content.Context  ?android.content.ContextWrapper  ?android.app.Service Service是应用程序Application的一个组件(component).它的作用有两点:1.用来提供一个长期在后台运行并且不与用户交互的操作,2.也可以为其他应用程序提供服务.Service

Android Binder分析二:Natvie Service的注冊

这一章我们通过MediaPlayerService的注冊来说明怎样在Native层通过binder向ServiceManager注冊一个service,以及client怎样通过binder向ServiceManager获得一个service,并调用这个Service的方法. Native Service的注冊 这里以MediaPlayerService举例来说明怎样在Native层注冊Service,首先来看main_mediaservice.cpp的main方法: int main(int a

Android Binder进程间通信---注册Service组件---启动Binder线程池

本文参考<Android系统源代码情景分析>,作者罗升阳 一.测试代码: -/Android/external/binder/server ----FregServer.cpp ~/Android/external/binder/common ----IFregService.cpp ----IFregService.h ~/Android/external/binder/client ----FregClient.cpp Binder库(libbinder)代码: ~/Android/fra

Android学习笔记二十六.跨进程调用Service(AIDL Service)

跨进程调用Service(AIDL Service) 一.AIDL Service 1.什么是AIDL Service? AIDL,即Android Interface Definition Language.是Android用于定义远程接口,AIDL接口定义语言的语法比较简单,这种接口定义语言并不是真正的编程语言,它只是定义两个进程之间的通信接口.AIDL的语法与Java接口很相似,但存在如下几点差异: (1)AIDL定义接口的源代码必须以.aidl结尾; (2)AIDL接口中用到数据类型,除

Android 通过JNI实现守护进程,使得Service服务不被杀死

来自: http://finalshares.com/read-7306 转载请注明出处: http://blog.csdn.net/yyh352091626/article/details/50542554 开发一个需要常住后台的App其实是一件非常头疼的事情,不仅要应对国内各大厂商的ROM,还需要应对各类的安全管家...虽然不断的研究各式各样的方法,但是效果并不好,比如任务管理器把App干掉,服务就起不来了... 网上搜寻一番后,主要的方法有以下几种方法,但都是治标不治本: 1.提高Serv

Android基础笔记(十一)- Service基础和注意事项以及Activity与Service的通信

Service的基本概念 为什么要有Service Service的基本用法 电话窃听器的小案例 Service和Activity通信 Service和Thread的关系 向光明而行! Service的基本概念 Service是Android的四大组件之一,在每一个应用程序中都扮演者非常重要的角色. 它主要用于在后台处理一些耗时的逻辑,或者去执行某些需要长期运行的任务.必要的时候,我们甚至可以在程序退出的情况下,让Service在后台继续保持运行状态. 既然都是被用于处理耗时的操作,那么我们什么

android菜鸟学习笔记28----Android中的Service生命周期及本地和远程服务绑定的实现

Service是Android中长期在后台运行的没有界面的组件,使用服务的优势在于:能够提高进程的优先级,系统不容易回收掉进程,即便回收了,内存充足的时候,会把进程重新创建. 1.服务的简单使用示例: 1.1.定义一个服务: 定义一个服务的方式是定义一个类继承自Service: 1 public class MyService extends Service { 2 3 @Override 4 5 public IBinder onBind(Intent intent) { 6 7 // TOD