Hi,欢迎来到华清远见移动互联网学院官网!国内王牌JAVAEE培训、Android培训、HTML5培训、UI培训、JAVA培训、VR培训机构!

  • 400-611-6270
  • 新浪微博
  • 微信
您当前的位置:移动互联网学院 > Android开发 > Android之AIDL使用

Android之AIDL使用

时间:2017-06-19 09:33 来源:移动互联网学院

学习中总是有那么一座大山挡在你的面前,你是视而不见,还是绕着山边的路走? 今天就来彻底翻阅挡在我面前的一座大山--AIDL

在Android中,如果我们需要在不同进程间实现通信,就需要用到AIDL技术去完成。

    AIDL(Android Interface Definition Language)是一种接口定义语言,编译器通过*.aidl文件的描述信息生成符合通信协议的Java代码,我们无需自己去写这段繁杂的代码,只需要在需要的时候调用即可,通过这种方式我们就可以完成进程间的通信工作。

    为什么我们要学习AIDL呢?这就要了解Android中Service创建的两种方法: startService或者bindService

   我们知道,服务不能自己运行,需要通过调用Context.startService()或Context.bindService()方法启动服务。这两个方法都 可以启动Service,但是它们的使用场合有所不同。使用startService()方法启用服务,调用者与服务之间没有关连,即使调用者退出了,服 务仍然运行。使用bindService()方法启用服务,调用者与服务绑定在了一起,调用者一旦退出,服务也就终止,大有“不求同时生,必须同时死”的 特点。

    如果打算采用Context.startService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onStart()方法。如果调用startService()方法前服务已经被创建,多次调用startService()方法并不会导致多次创建服务,但会导致多次调用onStart()方法。采用startService()方法启动的服务,只能调用Context.stopService()方法结束服务,服务结束时会调用onDestroy()方法。

    如果打算采用Context.bindService()方法启动服务,在服务未被创建时,系统会先调用服务的onCreate()方法,接着调用onBind()方法。这个时候调用者和服务绑定在一起,调用者退出了,系统就会先调用服务的onUnbind()方法,接着调用onDestroy()方法。如果调用bindService()方法前服务已经被绑定,多次调用bindService()方法并不会导致多次创建服务及绑定(也就是说onCreate()和onBind()方法并不会被多次调用)。如果调用者希望与正在绑定的服务解除绑定,可以调用unbindService()方法,调用该方法也会导致系统调用服务的onUnbind()-->onDestroy()方法。

    好了,说了这么多,我们还是来看一个例子吧!

   下面的一个例子非常简单,就是完成Activity与Service的绑定,点击Activity上的Button,获得颜色名称。

    我首先在服务端定义了AIDL接口

    

[java] view plain copy

1. package com.mdx.server;  

2.

3. interface ICat  

4. {  

5.    String getColor();  

6.      

7. }  

    定义好上面的AIDL接口之后,ADT工具就会在gen/com/mdx/server目录下生成一个ICat.java接口文件,在该接口文件中包含了一个 Stub内 部类,该内部类实现了IBinder ICat 接口,这个Stub类将会作为Service的回调类。它实现了IBinder接口,所以可以作为Service的OnBin的()接口的返回值。

    定义好AIDL接口之后,我们就可以定义一个Service实现类了。这个Service中的OnBind()方法所返回的IBinder对象就是那个ICat.Stub的子类的实例。

    先看一下服务端的目录结构:

     

  服务端代码:

[java] view plain copy

1. package com.mdx.server;  

2.

3. import android.app.Service;  

4. import android.content.Intent;  

5. import android.os.IBinder;  

6. import android.os.RemoteException;  

7. import android.util.Log;  

8.

9. import com.mdx.server.ICat.Stub;  

10.

11.

12. public class MyMusicService extends Service {  

13.

14.    private MyBinder myBinder;  

15.      

16.    public class MyBinder extends Stub  

17.    {  

18.        @Override  

19.        public String getColor() throws RemoteException {  

20.            // TODO Auto-generated method stub  

21.              

22.            return "yellow";  

23.        }  

24.          

25.    }  

26.

27.    @Override  

28.    public IBinder onBind(Intent intent) {  

29.        Log.i("MYSERVICE", "MyService is onBind!");  

30.

31.        return myBinder;  

32.    }  

33.

34.    @Override  

35.    public void onCreate() {  

36.        // TODO Auto-generated method stub  

37.        super.onCreate();  

38.          

39.        myBinder = new MyBinder();  

40.        Log.i("MYSERVICE", "MyService is onCreate!");  

41.

42.    }  

43.

44.      

45. }  

 

记得在mainest中注册Service。

 

客户端目录结构:

    客户端绑定远程Service的步骤分为两步:

创建ServiceConnetion对象

以ServiceConnection对象作为参数,调用Context的bindService()方法绑定远程Service

绑定远程Service的ServiceConnection并不能直接获取Service的OnBind()方法所返回的对象,它只能返回OnBind()方法所返回的对象的代理

 

客户端代码如下:

[java] view plain copy

1. package com.paad.client;  

2.

3. import android.app.Activity;  

4. import android.app.Service;  

5. import android.content.ComponentName;  

6. import android.content.Intent;  

7. import android.content.ServiceConnection;  

8. import android.os.Bundle;  

9. import android.os.IBinder;  

10. import android.os.RemoteException;  

11. import android.util.Log;  

12. import android.view.View;  

13. import android.view.View.OnClickListener;  

14. import android.widget.Button;  

15. import android.widget.ProgressBar;  

16. import android.widget.TextView;  

17.

18. import com.mdx.server.ICat;  

19.

20. public class MyActivity extends Activity {  

21.

22.    TextView asyncTextView;  

23.    ProgressBar asyncProgress;  

24.    Button start;  

25.

26.    private ICat myAidl;  

27.    // Handles the connection between the service and activity  

28.    private ServiceConnection mConnection = new ServiceConnection() {  

29.

30.        public void onServiceConnected(ComponentName className, IBinder service) {  

31.            // Called when the connection is made.  

32.            Log.i("MYACTIVITY", "OnserviceConnected() called");  

33.            myAidl = ICat.Stub.asInterface(service);  

34.

35.        }  

36.

37.        public void onServiceDisconnected(ComponentName className) {  

38.            // Received when the service unexpectedly disconnects.  

39.            Log.i("MYACTIVITY", "onServiceDisconnected() called");  

40.        }  

41.    };  

42.

43.    @Override  

44.    public void onCreate(Bundle savedInstanceState) {  

45.        super.onCreate(savedInstanceState);  

46.        setContentView(R.layout.activity_main);  

47.

48.        asyncTextView = (TextView) findViewById(R.id.asyncTextView);  

49.        // asyncProgress = (ProgressBar) findViewById(R.id.asyncProgress);  

50.        start = (Button) findViewById(R.id.start);  

51.

52.        Intent bindIntent = new Intent();  

53.        bindIntent.setAction("android.intent.action.AIDLService");  

54.        bindService(bindIntent, mConnection, Service.BIND_AUTO_CREATE);  

55.

56.        start.setOnClickListener(new OnClickListener() {  

57.

58.            @Override  

59.            public void onClick(View v) {  

60.                // TODO Auto-generated method stub  

61.

62.                String ss;  

63.                try {  

64.                    ss = myAidl.getColor();  

65.                    asyncTextView.setText("颜色是:" + ss);  

66.                } catch (RemoteException e) {  

67.                    // TODO Auto-generated catch block  

68.                    e.printStackTrace();  

69.                }  

70.

71.            }  

72.        });  

73.    }  

74.

75. }  

 

点击按钮,可以看到一下结果:

  • 北京

    010-82600385/6

    北京市海淀区西三旗悦秀路北京明园大学校内

  • 上海

    021-54485127

    上海市徐汇区漕溪路250号银海大楼11层

  • 深圳

    0755-25590506

    深圳市龙华新区人民北路美丽AAA大厦15层

  • 成都

    028-85405115

    成都武侯区科华北路99号科华大厦2层

  • 南京

    025-86551900

    南京市白下区汉中路185号鸿运大厦11层

  • 武汉

    027-87804688

    武汉工程大学卓刀泉校区科技孵化器大楼11层

  • 西安

    029-88756251

    西安市高新区高新1路12号天公大厦3层

  • 广州

    020-38342087

    广州市天河软件园柯木塱园5栋三层

  • 沈阳

    024-24349000

    沈阳市沈河区北顺城路137号锦峰大厦7层

  • 济南

    0531-88898293

    济南市高新区舜华路三庆世纪财富中心B3座6层

  • 重庆

    023-68064704

    重庆市九龙坡区渝州路87号双薪时代九楼

  • 长沙

    15010390966

    长沙市开福区芙蓉中路海东青大厦B座11楼

Copyright © 2004-2017 华清远见教育集团 版权所有,沪ICP备10038863号-3,京公海网安备110108001117号