Android -- Service绑定解绑和aidl

Service是安卓四大组件之一,先前讲到了Service的生命周期,以及非绑定类型的生命周期的例子,这次来分享一下绑定形式的。

应用组件(客户端)可以调用bindService()绑定到一个service。Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder。

绑定是异步的,bindService()会立即返回,它不会返回IBinder给客户端。要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给bindService()。ServiceConnection包含一个回调方法,系统调用这个方法来传递要返回的IBinder。

  • 实现ServiceConnection

实现必须重写两个回调方法:

onServiceConnected()

系统调用这个来传送在service的onBind()中返回的IBinder。

OnServiceDisconnected()

Android系统在同service的连接意外丢失时调用这个.比如当service崩溃了或被强杀了.当客户端解除绑定时,这个方法不会被调用。

  • 调用bindService(),传给它ServiceConnection的实现。
  • 当系统调用你的onServiceConnected()方法时,你就可以使用接口定义的方法们开始调用service了。
  • 要与service断开连接,调用unbindService()。
  • 程序                                                                                          
    public class MainActivity extends Activity {
    
        private Button btn_start;
        private Button btn_stop;
        private Button btn_change;
        private Button btn_bind;
        private Button btn_unbind;
    
        private MyConn myConn;
    
        private IService myBinder;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            btn_start = (Button) findViewById(R.id.btn_start);
            btn_stop = (Button) findViewById(R.id.btn_stop);
            btn_change = (Button) findViewById(R.id.btn_change);
            btn_bind = (Button) findViewById(R.id.btn_bind);
            btn_unbind = (Button) findViewById(R.id.btn_unbind);
            buttonListener bl = new buttonListener();
            btn_change.setOnClickListener(bl);
            btn_start.setOnClickListener(bl);
            btn_stop.setOnClickListener(bl);
            btn_bind.setOnClickListener(bl);
            btn_unbind.setOnClickListener(bl);
    
        }
    
        class buttonListener implements OnClickListener
        {
    
            @Override
            public void onClick(View v) {
                switch (v.getId()) {
                case R.id.btn_start:
                    Intent intent_start = new Intent(getApplicationContext(),BindService.class);
                    startService(intent_start);
                    break;
                case R.id.btn_stop:
                    Intent intent_stop = new Intent(getApplicationContext(),BindService.class);
                    stopService(intent_stop);
                    break;
                case R.id.btn_change:
                    if(myBinder != null)
                        myBinder.doChange("啦啦啦");
                    break;
                case R.id.btn_bind:
                    if(myConn == null)
                    {
                        myConn = new MyConn();
                        Intent intent_bind = new Intent(getApplicationContext(),BindService.class);
                        bindService(intent_bind, myConn, BIND_AUTO_CREATE);
                    }
                    break;
                case R.id.btn_unbind:
                    Intent intent_unbind = new Intent(getApplicationContext(),BindService.class);
                    if(myConn != null && myBinder != null)
                    {
                        unbindService(myConn);
                        myConn = null;
                        myBinder = null;
                    }
                    break;
    
                default:
                    break;
                }
    
            }
    
        }
    
        private class MyConn implements ServiceConnection
        {
    
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                System.out.println("代理人返回回来了,onServiceConnected");
                myBinder = (IService) service;
    
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
                System.out.println("接触绑定了,onServiceDisconnected");
    
            }
    
        }
    
    }

    Service类:

    public class BindService extends Service {
    
        @Override
        public IBinder onBind(Intent intent) {
            System.out.println("Service绑定成功,onBind");
            //返回自定义的代理对象
            return new MyBinder();//这里的返回是返回到MainActivity里面的绑定myConn
        }
    
        @Override
        public boolean onUnbind(Intent intent) {
            System.out.println("Service解绑成功,onUnbind");
            return super.onUnbind(intent);
        }
    
        public class MyBinder extends Binder implements IService
        {
            //间接的利用代理人调用了changeServiceThing的方法
            public void doChange(String what)
            {
                changeServiceThing(what);
            }
        }
    
        @Override
        public void onCreate() {
            System.out.println("Service开启,onCreate");
            super.onCreate();
        }
    
        @Override
        public void onDestroy() {
            System.out.println("Service关闭,onDestroy");
            super.onDestroy();
        }
    
        public void changeServiceThing(String what)
        {
            Toast.makeText(getApplicationContext(), what+"变换了,changeServiceThing", Toast.LENGTH_LONG).show();
        }
    
    }

    IService:

    public interface IService {
        public void doChange(String what);
    }

    结果                                                                                           

    点击“开启服务”之后,再“绑定服务”,这样执行之后直接点“关闭服务”是没用的,要先“解除服务”,再“关闭服务”。如果直接“绑定服务”,那么点击“关闭服务”没有用,需要点击“解绑服务”。

    aidl                                                                                           

    进程间通信->调用者和Service如果不在一个进程内,就需要使用android中的远程Service调用机制。

    android使用AIDL定义进程间的通信接口。AIDL的语法与java接口类似,需要注意以下几点:

    • AIDL文件必须以.aidl作为后缀名。
    • AIDL接口中用到的数据类型, 除了基本类型, String, List, Map, CharSequence之外, 其他类型都需要导包, 即使两种在同一个包内. List和Map中的元素类型必须是AIDL支持的类型。
    • 接口名需要和文件名相同。
    • 方法的参数或返回值是自定义类型时, 该自定义的类型必须实现了Parcelable接口。
    • 所有非java基本类型参数都需要加上in, out, inout标记, 以表明参数是输入参数, 输出参数, 还是输入输出参数。
    • 接口和方法前不能使用访问修饰符和static, final等修饰。

    进程间通信需要创建aidl文件,IService.aidl:

    public interface IService {
        public void doChange(String what);
    }

    接口中有一个static的抽象内部类Stub,Stub类继承了Binder类并实现了IRemoteService接口。

    public class MainActivity extends Activity {
    
        private Intent intent;
        private IService iService;
        private ServiceConnection myConn;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
        }
    
        public void bind(View view) {
            intent = new Intent();
            intent.setAction("com.yydcdut.alipay");
            myConn = new MyConn();
            boolean flag = bindService(intent, myConn, BIND_AUTO_CREATE);
            System.out.println("flag------>" + flag);
        }
    
        private class MyConn implements ServiceConnection {
            @Override
            public void onServiceConnected(ComponentName name, IBinder service) {
                iService = IService.Stub.asInterface(service);
            }
    
            @Override
            public void onServiceDisconnected(ComponentName name) {
            }
        }
    
        public void method(View view) {
            try {
                iService.callMethodInService();
            } catch (RemoteException e) {
                // TODO 自动生成的 catch 块
                e.printStackTrace();
            }
        }
    
    }

    在实现这个的时候我建立了两个程序,这样可以做到进程间通信。附带了源码。

    我是天王盖地虎的分割线                                                               

    源代码:http://pan.baidu.com/s/1dD1Qx01

    service学习2.zip

    aidl学习.zip

    aidl学习配套2.zip

    转载请注明出处:http://www.cnblogs.com/yydcdut

Android -- Service绑定解绑和aidl,布布扣,bubuko.com

时间: 2024-10-03 14:55:47

Android -- Service绑定解绑和aidl的相关文章

android Service详解

Android Service完全解析,关于服务你所需知道的一切(上) http://blog.csdn.net/guolin_blog/article/details/11952435 android笔记--处理started service的多次启动请求 http://coolxing.iteye.com/blog/1284476

Android Service详解(三) AIDL使用解析

aidl是 Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口. 通过aidl我们可以完成从服务端到客户端的数据通信 在aidl中我们可以声明任意多个方法,除了内建类型(int boolean等)都需要导入,规则如下: 1.Java 原始类型不需要导入. 2.String.Lsit.Map 和 CharSequence 不需要导入. 创建aidl文件,New->file->文件名

Android Service详解(二)

Service中有四个重要函数:     public IBinder onBind(Intent arg0):    //必须实现,返回接口给Service     public void onCreate():                //Service创建时调用     public void onStart(Intent intent,int startId)://通过startService()会调用     public void onDestroy():           

Android Service详解(一)

Service 是 Android 系统提供的四种组件之一它的地位和Activity是并列的只不过没有 Activity 的使用频率高.Service是运行在后台的一种服务程序一般很少和用户交互,因此没有可视化界面. 定义一个Service类比较简单,只要继承Service类实现其生命周期中的方法就可以了.一个定义好的Service必须在 AndroidManifest.xml 配置文件中通过<smice>元素声明才能使用. Service 有自己的生命周期,我们可以调用startServic

centos 绑定/解绑 新增/删除 ip (配置/etc/sysconfig/network-scripts/ifcfg-ethx)

服务器中有多个ip,其中有若干个ip不用了,需要删掉 使用ip addr命令查看有几个ip 然后 cd  /etc/sysconfig/network-scripts/ vi /etc/sysconfig/network-scripts/ifcfg-eth0 主要的操作就是IPADDR和NETMASK这两个键值对     如果是新增,就增加IPADDR和NETMASK即可,比如IPADDR1和NETMASK1    IPADDR2和NETMASK2    我也是小白,根据我的经验应该是必须按顺序

javascript 方法 / 绑定 解绑事件

很多JS插件的代码开头都是 (function(  一直不太明白    直到看到  // 事件绑定  this.bindHandler = (function() {                  if (window.addEventListener) {// 标准浏览器           return function(elem, type, handler) {// elem:节点    type:事件类型   handler:事件处理程序               // 最后一个

Android Service 深度解析(1)

Android Service 深度解析(1) 这段时间我重新对Android基础进行了学习,还是先从官方文档开始,做了关于Service的文档翻译,熟悉了关于Service的知识点.但是在用的时候还是有很多需要注意的地方,需要把这些知识点联系起来,因此有了这篇文章.我将主要从以下几个方面对Service类进行深度解析: 1. Service的生命周期(看起来简单,实际上很复杂的): 2. 绑定运行Service(Bound Service)的多种形式实现及其使用: 主要包括本地Service继

Android Service的两种启动方式

参考链接 1. 概念 开始,先稍稍讲一点android中Service的概念和用途吧~ Service分为本地服务(LocalService)和远程服务(RemoteService): 1.本地服务依附在主进程上而不是独立的进程,这样在一定程度上节约了资源,另外Local服务因为是在同一进程因此不需要IPC, 也不需要AIDL.相应bindService会方便很多.主进程被Kill后,服务便会终止. 2.远程服务为独立的进程,对应进程名格式为所在包名加上你指定的android:process字符

Service的启动与停止、绑定与解绑

---恢复内容开始--- Service的意义就在于当软件停止之后还可以在背景中进行运行,换句话也就是说,比如一个音乐播放器,当我们退出音乐播放器的时候,还是希望它在背景中运行,也就是一直播放着音乐,这时候Service就派上了大的用途. Service的生命周期和Activity的生命周期差不多.也有开启和停止.onCreate()方法是初始化配置,onDestroy()是释放所有剩余的资源.Service周期是发生在onCreate()和onDestroy()之间的. startServic