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会帮我们生成一个类的了

Android的AIDL以及挂断电话_第1张图片

接下来,我们再写一个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文件也拷贝到这个项目里面

Android的AIDL以及挂断电话_第2张图片


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

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目录下面

Android的AIDL以及挂断电话_第3张图片

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

Android的AIDL以及挂断电话_第4张图片

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


既然把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 file.createNewFile方法问题总结
  2. Android应用程序全屏显示的方法
  3. Android 实现模拟按键方法
  4. Android屏幕横屏竖屏切换的方法
  5. Android WIFI热点默认SSID的修改方法
  6. Android:软件卸载的另一种方法adb uninstall
  7. android实现Parcelable序列化对象
  8. android 网络判断的几种方法

随机推荐

  1. 深度:边缘和5G对服务器的需求
  2. 全球AI芯片技术选型
  3. ant_时提示前言不允许有内容问题
  4. JavaScript 基本数据类型
  5. 深度:RISC-V指令集架构和生态
  6. web前端入门到实战:css 中的背景图片小技
  7. 免费下载SVCI 2020 V12.0:升级了梅赛德斯-
  8. 为什么越来越多的数据分析师在用思迈特软
  9. 数字化转型中的数据安全问题探讨
  10. ITSS运行维护标准认证的好处