RemoteService与AIDL学习总结

最近公司内部组织的一个ANdroid四大组件的培训,由于自己是菜鸟,考试时被老师的一个问题忽悠住了,甚是丢人,估计过两天会被人事总监请喝茶。问题是Remote Service的生命周期是什么,我这一抬眼啊,就直接哆嗦了,什么?Remote是什么东东,RemoteService又是什么东东,其实大概知道就是那个什么AIDL的破玩意儿,之前还写过Demo,准确的说是copy别人的Demo,唉唉。。。所以说还是要自己动手翘翘才能容易理解啊,在大庭广众之下回答不上来,那是相当的没面子啊。事后想想这真是个简单的问题,Local Service,Remote Service不都是Service吗,只怪自己胆小,紧张之余把这个都忘了。话不多说,进入自己的yy当中,完全自己理解,如有错误,敬请谅解啊。

1.最起码知道AIDL全称是什么吧,Android Interface Describe Language,不知道单词对不对,反正就是这个意思。

2.要知道他是干嘛用的吧!进程间通信,就是两个不同进程间通信,就像QQ斗地主和QQ之间进行什么授权,我感觉应该就是用的这个,第一次登录斗地主的时候是要用户名和密码的,如果你装了QQ,那他就直接和QQ之间进行了通信,并且读取了QQ的帐号信息,然后登录斗地主,不知道腾讯的大牛是不是这么做的。

3.我理解的步骤是:利用intent开启远程的Service,然后远程的Service就会启动,并且返回一个Ibinder,我就当他是个大包裹,按了包裹发射器,远程的邮局就向我发射大包裹,导弹里就携带了我需要的东西,美女、钞票,美哉。就是这个Service是另一个进程当中的,所以和我通信,是需要废一番周折的,如果是本地service,也就是同一个进程当中的话,我就直接伸手把美女抱住不就得了。

4.话说AIDL能处理的还真不是美女,钞票啊,他能处理的数据包括JAVA基本数据类型,还有list,map啦,还有就是实现了Parceble接口的实例化对象,这个很好嘛,基本够用了。

接下来就看看代码怎么实现吧:

(1)  间两个工程,Cilent和Server,在两个工程中建相同的一个包,注意!!!包名一定要完全相同,再在包下建立一个完全相同aidl文件,

package com.neil.aidl;
interface ICallBack{
  void giveCallBack(String parm);
}

好了,这是Client的ICallack.aidl,那么Server中的也得有一个和这个一模一样的文件,文件里就定义了一个接口,当然可以是多个接口,想几个就几个,返回值和参数跟是上面4所说的啦。定义好这个爱的了文件,那么在Android工程的gen目录下会自动生成一个JAVA类文件,长什么样子,自己去看就知道了,等他生成了java类以后,我们在客户端服务端就可用他们了,

(2)先来个简单的,进程间传个int吧,

先看服务端代码实现:

public class RemoteService extends Service{

    private  int count=100;
    @Override
    public void onCreate() {
        // TODO Auto-generated method stub
        super.onCreate();
        Toast.makeText(getApplicationContext(), "onCrearte", Toast.LENGTH_SHORT).show();
    }
    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        // TODO Auto-generated method stub
        Toast.makeText(getApplicationContext(), "onStartCommand", Toast.LENGTH_SHORT).show();
        return super.onStartCommand(intent, flags, startId);
    }
    @Override
    public IBinder onBind(Intent intent) {
        // TODO Auto-generated method stub
        System.out.println("remote onBind "+countservice);
        Toast.makeText(getApplicationContext(), "onbind", Toast.LENGTH_SHORT).show();
        return countservice;
    }
    CountService.Stub countservice=new CountService.Stub() {

        @Override
        public int getCount() throws RemoteException {return count;
        }
    };

话说这里的就是一个Service的继承类,里边的生命周期一目了然,客户点bindService之后,这个service自然会先调用onCreate()方法了,随后就调用了onBind()方法,这个方法返回的是一个什么咧,看看,就是一个CountService的内部类Stub的对象,这个可以在gen下的文件中找到,他继承之binder,所以Service通过onind()方法返回给客户端的是一个Binder对象,而且这个Binder对象还实现了你在aidl文件中定义的那个接口,这下,好办了,你想得到什么,统统放在这个Stub实例中就OK了,当客户端地到之后,就可以取出里边返回的数据

且看客户端是怎么得到这个Binder的

  public void bindRemoteService(){
      Intent intent=new Intent();
      intent.setAction(BIND_ACTION);
      bindService(intent, mConnection, BIND_AUTO_CREATE);
  }

这里便就是bindService了,看看里边的参数,第一个就是标志你要开启目标服务的的那个intent对象,第二个就是一个实现了ServiceConnection接口的对象,看看这个ServiceConnection对象

class CountServiceConnection implements ServiceConnection{

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        // TODO Auto-generated method stub
        mCountService=CountService.Stub.asInterface(service);
        showToast("connected");
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {
        mCountService=null;
        showToast("disconnected");
    }

  };

看见没,上面讲到的那个Binder对象就是在这里跑到客户端来的 mCountService=CountService.Stub.asInterface(service);

从这个mountService对象里就能得到在服务端放进去的数据。话说这就是AIDL进行跨进程通信的方法

话说还可以实现双方相互通信,客户端也可以想服务端传输数据,这时候就无所谓Client和Server。具体见Demo了。

http://download.csdn.net/detail/qmc0000/7938223
时间: 2024-10-03 22:25:50

RemoteService与AIDL学习总结的相关文章

AIDL学习

AIDL学习前知识 AIDL:Android Interface Definition Language,即Android接口定义语言 AIDL使用情景:Android中不同的进程之间不能直接通信,相互调用接口,实现数据的共享.此时,便能用AIDL来实现这中需求. Android使用Binder来实现进程间通信,Binder有点像一架桥梁,链接两个不同的进程: Binder能够携带processA的请求信息,告知processB需要调用processB的哪个接口,并返回processA所需要的接

Android(java)学习笔记232: 远程服务之 ipc和aidl (面试常问)

一.IPC inter process communication  进程间通讯 二.aidl android  interface  defination  language  安卓接口定义语言 满足两个进程之间  接口数据的交换(ipc) 首先我们搞清楚两个概念  远程服务和本地服务 ?            本地服务:服务的代码在应用程序工程的内部            远程服务:服务的代码在另一个应用程序的里面 三.下面通过案例说明aidl 和 ipc  在远程服务中使用 1.首先创建一

Android -- Service绑定解绑和aidl

Service是安卓四大组件之一,先前讲到了Service的生命周期,以及非绑定类型的生命周期的例子,这次来分享一下绑定形式的. 应用组件(客户端)可以调用bindService()绑定到一个service.Android系统之后调用service的onBind()方法,它返回一个用来与service交互的IBinder. 绑定是异步的,bindService()会立即返回,它不会返回IBinder给客户端.要接收IBinder,客户端必须创建一个ServiceConnection的实例并传给b

Android 综合揭秘 —— 全面剖释 Service 服务

引言 Service 服务是 Android 系统最常用的四大部件之一,Android 支持 Service 服务的原因主要目的有两个,一是简化后台任务的实现,二是实现在同一台设备当中跨进程的远程信息通信. Service 服务主要分为 Local Service 本地服务与 Remote Service 远程服务两种,本地服务只支持同一进程内的应用程序进行访问,远程服务可通过AIDL(Android Interface Definition Language)技术支持跨进程访问.服务可以通过C

如何自学Android

如何自学Android 欢迎转载,转载请注明原地址:http://blog.csdn.net/lavor_zl/article/details/51217319,谢谢. 1. Java知识储备 本知识点不做重点讲解: 对于有基础的同学推荐看<Java编程思想>,巩固基础,查漏补全,了解并熟悉更多细节知识点. 对于没有基础的同学推荐看一本Java基础的书籍,看完后可以继续看<Java编程思想>提升自己. 对于自认为时间很充裕,只要基础学扎实就好的推荐看<疯狂Java讲义>

Android:IPC之AIDL的学习和总结

为了使得一个程序能够在同一时间里处理许多用户的要求.即使用户可能发出一个要求,也肯能导致一个操作系统中多个进程的运行(PS:听音乐,看地图).而且多个进程间需要相互交换.传递信息,IPC方法提供了这种可能.IPC方法包括管道(PIPE).消息排队.旗语.共用内存以及套接字(Socket). Android中的IPC方式有Bundle.文件共享.Messager.AIDL.ContentProvider和Socket. 这次我们学习的是Android中的AIDL. 概述 AIDL(Android接

android学习之remote service 的aidl详解

写在前面的话: 关于remote service中使用aidl来实现跨进程,多线程通信,我是参考了三篇文章,大概把这个弄明白了. (1)android 官方关于aidl的说明文档 docs/guide/components/aidl.html (2)Android学习笔记23服务Service之AIDL和远程服务实现进程通信以及进程间传递自定义类型参数 http://blog.csdn.net/honeybaby201314/article/details/19989455 (3) Androi

【学习笔记】AIDL跨应用Service运用

AIDL:应用程序接口定义语言 注:每当创建或修改AIDL文件后,都需要执行Build->Rebuild Project操作来生效 一.通过一个App控制另一个App的Service 在要调用的App的MainActivity里用intent设置一个部件,参数是部件名字,一个是被调用的包名,一个是被调用的服务类名 然后在要调用的App的MainActivity里用startService和stopService即可控制另一个程序的Service 二.通过一个App绑定另一个App的Service

Android学习小Demo(23)Aidl实现进程间通信

我们知道,Android是靠Binder机制来实现进程间的通信,而上一篇文章中,我们利用AIDL,简单地从代码方面的角度讲解了在服务端中的Binder的存在形式,是以服务的实现存在的,而在客户端,则是以代理的形式,实现存在的只是一个关于服务端的Binder实现的引用. 理论上的东西我们要去学习掌握,但是也不能忽略了实际的动手能力,对吧. 今天,我们就一步一步地利用我们所了解地关于AIDL的知识来实现一个跨进程通信的例子. 在Android的上层应用中,每一个App都是一个单独的进程,所以,要实现