请选择 进入手机版 | 继续访问电脑版
JAVEN

Service服务基础介绍(三)AIDL使用

所在版块: 课堂笔记 2016-04-28 17:13   [复制链接] 查看: 1500|回复: 3
本帖最后由 yangjw 于 2016-4-28 17:16 编辑

  • 介绍
在说到AIDL之前,作为一个使用过Android Service的程序员,必须要知道IPC是什么鬼。IPC就是进程间通信的英文缩写。
其实上一篇文章介绍的Messenger的通信底部实现就是采用的AIDL,是一种简化的AIDL通信。如果不需要多线程多进程并发的情况,使用Messenger对象就能满足我们日常的开发工作。

  • 注意
使用AIDL只有在你允许来自不同应用的客户端跨进程通信访问你的service,并且想要在你的service种处理多线程的时候才是必要的。 如果你不需要执行不同应用之间的IPC并发,你应该通过实现Binder建立你的接口,或者如果你想执行IPC,但是不需要处理多线程。那么使用Messenger实现你的接口 不管怎样,确保你在实现一个AIDL之前理解了Bound Service

  • 使用(以下代码是我很早写的一篇文章,此处拿来直接用)
AIDL即Android 接口描述(定义)语言。
简单说,就是进程和进程之间通信的一种规范,再简单说,就是2个应用之间怎么通信。
所以在这,直接上图
步骤1.首先定义2个android project,名称分别为AIDLServer和AIDLClient。
两个工程的目录结果如下:


步骤2.两个工程创建好之后,在AIDLClient project和AIDLServer project中都定义一个名为“com.android.my.aidl”的包(当然包名可以自己定义,此包用来放AIDL文件)。 步骤3.创建AIDL文件,并将创建好的文件放到“步骤2”中定义的包中,AIDL文件内容如下:
  1. package com.android.my.aidl;

  2. interface ICommonInterface {
  3.    int getCount();//此抽象方法将在AIDLServer project中重写,将在AIDLClient project中调用
  4. }
复制代码
注意:以上AIDL文件中package名和“步骤2”中定义的包名一致(因为此文件是放在这个包下面),AIDL中定义了一个java中的接口,但是注意aidl不是java文件,如果是第一次学习AIDL,建议定义简单数据类型,因为aidl的数据类型也有限制(网上有说明)。
步骤4.在AIDLServer project中新定义一个包,在此包下定义一个service,代码如下:
  1. package com.android.server;

  2. import com.android.my.aidl.ICommonInterface;

  3. import android.app.Service;
  4. import android.content.Intent;
  5. import android.os.IBinder;
  6. import android.os.RemoteException;

  7. public class ServerService extends Service {
  8.         
  9.         public class CommonInterface extends ICommonInterface.Stub {
  10.                 //此方法是AIDL文件中定义的抽象方法的重写,返回一个数字2
  11.                 public int getCount() throws RemoteException {
  12.                         // TODO Auto-generated method stub
  13.                         return 2;
  14.                 }
  15.                
  16.         }

  17.         @Override
  18.         public IBinder onBind(Intent arg0) {
  19.                 // TODO Auto-generated method stub
  20.                 return new CommonInterface();//注意:此处返回对象就是以上内部类对象
  21.         }

  22. }
复制代码
service代码写完之后,不要忘了在AndroidManifest.xml中声明,声明代码如下:
  1. <service android:name="ServerService">
  2.             <intent-filter>
  3.                 <action android:name="com.android.my.aidl.ICommonInterface"/>
  4.             </intent-filter>
  5.         </service>
复制代码
到此AIDLServer工程就大功告成了,其中AIDLServerActivity.java是创建工程时自动生成的,没有添加任何代码。

步骤5.接下来是完善AIDLClient的代码。
在AIDLClient工程中就一个AIDLClientActivity类,其中代码如下:
  1. package com.android.client;

  2. import com.android.my.aidl.ICommonInterface;

  3. import android.app.Activity;
  4. import android.content.ComponentName;
  5. import android.content.Context;
  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.widget.Button;

  14. public class AIDLClientActivity extends Activity {
  15.     /** Called when the activity is first created. */
  16.         
  17.         private ICommonInterface common;
  18.     @Override
  19.     public void onCreate(Bundle savedInstanceState) {
  20.         super.onCreate(savedInstanceState);
  21.         setContentView(R.layout.main);
  22.         Button btn = (Button) findViewById(R.id.button1);
  23.         btn.setOnClickListener(new View.OnClickListener() {
  24.                         
  25.                         @Override
  26.                         public void onClick(View v) {
  27.                                 Intent intent = new Intent(ICommonInterface.class.getName());
  28.                                 bindService(intent, serviceConn, Context.BIND_AUTO_CREATE);
  29.                                 Log.d("YJW", "click");
  30.                         }
  31.                 });
  32.     }
  33.    
  34.     private ServiceConnection serviceConn = new ServiceConnection() {
  35.                
  36.                 @Override
  37.                 public void onServiceDisconnected(ComponentName name) {
  38.                         // TODO Auto-generated method stub
  39.                         Log.d("YJW", "onServiceDisconnecte " );
  40.                 }
  41.                
  42.                 @Override
  43.                 public void onServiceConnected(ComponentName name, IBinder service) {
  44.                         // TODO Auto-generated method stub
  45.                         common = ICommonInterface.Stub.asInterface(service);
  46.                         try {
  47.                                 Log.d("YJW", "count = " + common.getCount());//此处调用的就是AIDLServer中的getCount方法
  48.                         } catch (RemoteException e) {
  49.                                 e.printStackTrace();
  50.                         }
  51.                 }
  52.         };
  53. }
复制代码
注意以上代码就是一个按钮,加上一个监听。以上调用getCount()方法返回的值,我只是以log形式打印出来了(可以再logcat窗口中查看),当然也可以加TextView显示出来
ok,所有代码完毕。
接下来就是把这2个工程安装到手机,然后点开AIDLClient应用,点击按钮,就可以获取AIDLServer返回的值。




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

我的博客

QQ|Archiver|手机版|小黑屋|课堂笔记  

GMT+8, 2018-12-12 10:29 , Processed in 0.078376 second(s), 28 queries .

快速回复 返回列表