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
{
@Override
public IBinder onBind(Intent intent)
{
//返回我们自己的Binder
return new MyBinder();
}
@Override
public void onCreate()
{
System.out.println("service onCreate");
super.onCreate();
}
//服务里面的方法
public void sayService()
{
System.out.println("我是另一个进程里面的方法喔");
}
//继承由AIDL生成的抽象类
class MyBinder extends IService.Stub
{
@Override
public 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;
@Override
public 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();
}
}
@Override
protected void onDestroy()
{
if(conn != null)
{
this.unbindService(conn);
}
super.onDestroy();
}
class MyServiceConnection implements ServiceConnection
{
@Override
public void onServiceConnected(ComponentName name, IBinder service)
{
//拿到我们当时自己写的Binder对象
iService = IService.Stub.asInterface(service);
}
@Override
public 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
{
@Override
public 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"/>
好啦,到这里,挂断电话的操作就完成的啦,可以测试一下啦,然后我们手机卫士的这个项目的黑名单那里也有挂断电话的操作的喔
今天源码下载
分享到:
相关推荐
NULL 博文链接:https://mft.iteye.com/blog/2026983
android挂断电话,需要使用aidl。资源我发上来了。 还解决了双卡无法挂断你的问题。 百度搜出来的,都没有解决
1、创建android.telephony包,把NeighboringCellInfo.aidl复制进去。 2、创建com.android.internal.telephony包,把ITelephony.aidl复制进去。
Android 实现自动接听和挂断电话功能.zip android 悬浮窗 监视内容.rar android 指南针 源码.rar Android 瀑布流 Demo.rar Android 版本检测与管理.rar Android 电子杂志(带翻页效果)源码.rar Android 电量显示...
Android挂断电话
说明:由于挂断电话android api不是对外开放的,所以需要使用反射的方法得到拨打电话的服务。 1.将android源代码中的”aidl”文件拷贝到项目中 这样项目中会生成两个包:android.telephony;此包中文件为:...
一、问题描述 使用BordercastReceiver和Service组件实现下述功能: 1.当手机处于来电状态,启动监听服务,对... Android没有对外公开结束通话的API,要结束通话就必须使用AIDL与电话管理服务进行通信,并调用服务中的
android电话状态监控,实现自动挂断电话
(2)call_aidl用程序控制接听和挂断动作。利用此技术可以实现来电黑名单。 (3)call_list获取通话记录。所有的通话记录保存在contacts2.db数据库文件的calls表中,本代码将calls表中的电话号显示在ListView控件中。...
JAVA的反射机制,探秘TelephonyManager在Framework里包含却在SDK隐藏的... 调用TelephonyManager的隐藏API是先参考Framework的/base/telephony/java/com/android/internal/telephony/ITelephony.aidl,然后自己实现一
此源码为双卡手机自带专业来电防火墙的反编译整理后的源码,条理清晰,代码齐全,做为学习实现AIDL、来电黑名单、反射等具有很好的参考价值,使用Android Studio整理