Android的AIDL是什么呢,AIDL就是Android Interface Defination Language,其实说白了,它就是Android定义好的,进程间通信的一种机制而已,

有点像那个调用Service里面的方法。

好,我们下面就通过代码来说明

首先,我们先写一个接口

com.xiaobin.service.IService

package com.xiaobin.service;public interface IService{public void sayService();}

很简单,就一个方法而已,和我们之前讲的 调用Service里面的方法一样,

现在就说一下不同的地方啦,我们现在就要把上面那个接口里的方法的修饰符public去掉,然后再把后缀名改为.aidl

然后呢,我们就会发现Eclipse会帮我们生成一个类的了


接下来,我们再写一个Service类

com.xiaobin.service.remote.RemoteSrevice

package com.xiaobin.service.remote;import android.app.Service;import android.content.Intent;import android.os.IBinder;import android.os.RemoteException;import com.xiaobin.service.remote.IService;public class RemoteService extends Service{@Overridepublic IBinder onBind(Intent intent){//返回我们自己的Binderreturn new MyBinder();}@Overridepublic void onCreate(){System.out.println("service onCreate");super.onCreate();}//服务里面的方法public void sayService(){System.out.println("我是另一个进程里面的方法喔");}//继承由AIDL生成的抽象类class MyBinder extends IService.Stub{@Overridepublic void invokeServiceMethod() throws RemoteException{//调用服务里面的方法sayService();}}}

写完这个之后,我们就要在AndroidMainfest里面注册它了

        <service android:name="com.xiaobin.service.remote.RemoteSrevice">            <intent-filter>                <action android:name="com.xiaobin.remoteservice"/>            </intent-filter>        </service>

大家可以看到,我们指定了一个action,这个是为了呆会调用时所指定的。

好啦,到现在为止,我们的远程服务就已经写好的了


接下来,我们新建一个项目,注意,是新建一个项目,然后写一个调用刚刚我们写的这个服务的类

但在写之前,我们要把我们刚刚写好的aidl文件也拷贝到这个项目里面



那么,接下来,我们就写一下我们的调用逻辑了

com.xiaobin.aidlservice.MainActivity

package com.xiaobin.aidlservice;import android.app.Activity;import android.content.ComponentName;import android.content.Intent;import android.content.ServiceConnection;import android.os.Bundle;import android.os.IBinder;import android.os.RemoteException;import android.view.View;import android.widget.Toast;import com.xiaobin.service.remote.IService;public class MainActivity extends Activity{private IService iService = null;private MyServiceConnection conn;@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.main);conn = new MyServiceConnection();Intent intent = new Intent();// 刚刚在注册那个服务时指定的intent.setAction("com.xiaobin.remoteservice");this.bindService(intent, conn, BIND_AUTO_CREATE);}public void click(View v){try{if(iService != null){//调用接口里面的方法iService.invokeServiceMethod();}else{Toast.makeText(this, "调用远程服务出错", Toast.LENGTH_SHORT).show();}}catch (RemoteException e){e.printStackTrace();}}@Overrideprotected void onDestroy(){if(conn != null){this.unbindService(conn);}super.onDestroy();}class MyServiceConnection implements ServiceConnection{@Overridepublic void onServiceConnected(ComponentName name, IBinder service){//拿到我们当时自己写的Binder对象iService = IService.Stub.asInterface(service);}@Overridepublic void onServiceDisconnected(ComponentName name){}}}


好啦,到现在为止,我们的代码就写好的啦,现在我们就可以测试一下的啦,年一下System.out这个标签的输出就可以啦

讲到这里,我们就要讲一下AIDL有什么应用啦

下面我们就讲一个挂断电话的例子,我们知道,Android的api里面是没有挂断电话的操作的

那如果我们的应用就有这样一个需求呢,那怎么办

其实也很容易,就是通过aidl来挂断电话,那么我们现在来写一下

首先,我们先把两个aidl文件复制到src目录下面


你肯定会问,这些aidl文件是在那里找到的,那么我可以告诉你,这些是Android的源码里面找到的,就是在base这个下面的


大家可以下载下来看看,如果有不会的,请看点击这里


既然把aidl文件拷贝过去之后,我们就可以写代码啦

com.xiaobin.endcall.MainActivity

package com.xiaobin.endcall;import java.lang.reflect.Method;import com.android.internal.telephony.ITelephony;import android.app.Activity;import android.os.Bundle;import android.os.IBinder;import android.view.View;public class MainActivity extends Activity{@Overridepublic void onCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);this.setContentView(R.layout.main);}public void click(View v){endCall();}//挂断电话private void endCall(){try{//通过反射拿到android.os.ServiceManager里面的getService这个方法的对象Method method = Class.forName("android.os.ServiceManager").getMethod("getService", String.class);//通过反射调用这个getService方法,然后拿到IBinder对象,然后就可以进行aidl啦IBinder iBinder = (IBinder) method.invoke(null, new Object[] {TELEPHONY_SERVICE});ITelephony telephony = ITelephony.Stub.asInterface(iBinder);telephony.endCall();}catch (Exception e){e.printStackTrace();}}}


因为那个服务没有公开的,所以我们就要用到反射来调用这个服务,来拿到Binder对象


还有重要的一点喔,要加上相应的权限,不然挂不断的喔

    <uses-permission android:name="android.permission.CALL_PHONE"/>

好啦,到这里,挂断电话的操作就完成的啦,可以测试一下啦,然后我们手机卫士的这个项目的黑名单那里也有挂断电话的操作的喔


今天源码下载

更多相关文章

  1. Android(安卓)APK安装过程及原理详解
  2. android中获得屏幕、视图、任务栏、状态栏的高宽以及屏幕的设置
  3. Android(安卓)onSaveInstanceState和onRestoreInstanceState的用
  4. Android(安卓)context源码详解及深入分析
  5. Android的两种数据存储方式分析(一)
  6. android jni介绍
  7. android实现视频播放的几种方式
  8. 浅谈Java中Collections.sort对List排序的两种方法
  9. Python list sort方法的具体使用

随机推荐

  1. Android: Bluetooth profile list for 2.
  2. Android 系统操作
  3. android语音识别和语音播报相关资料总结
  4. android 使用动画 Button移动后不响应点
  5. Android_开发 Android传感器(加速度传感器
  6. 获取与修改android自带日历日程
  7. 【Android】ImageMap,图片地图
  8. Android自定义Dialog以控制其位置和宽高
  9. 坚向的ViewPager,上下滑动的组件,android上
  10. Android中的MD5加密