Android学习笔记(七)

AIDL进程间通信;AIDL(Android Interface Design Language)

▲№aidl接口语法:
1、支持package 和 import等关键字
支持void interface等关键字
2、不支持访问修饰符
3、接口中不能定义常量只能定义方法
4、参数类型或返回类型:
a、基本类型
b、CharSequence
c、String
d、List
e、Map
f、Parcelable 可打包对象
5、基本类型、CharSequence、String、List和Map在使用时不需要导包,除此之外的所有类型,使用时必须import,即便该类型与接口定义在同一包中也如此
★№[匿名内部类 class A{new B(){},new C(){}},B和C和引用名称为:A.$1,A.$2;]

★№AIDL实现跨进程通信原理:在服务端Service和客户端(另一个进程的Activity)共用一个公用的接口,该接口使用AIDL定义,Android系统将该接口实现IInterface的方法并会自动生成该接口的跨进程实现类,

public static abstract class Stub extends Binder implements 
   com.fanfan.aidl.musicplay.MusicPlayControllor{  ... }

生成的Stub类继承了Binder即可通过进程边界进行跨进程通信,而又实现了AIDL定义的接口,则可实现该接口下的所有方法。

在客户端定义相同的AIDL接口(包名相同),同样会生成该接口的跨进程实现类Stu;但系统会进行判断,该客户端是否是在同一进程内,若不在同一进程内,则会生成Stu类的代理Stu.Proxy(obj);
●内部代码为:

 public static com.fanfan.aidl.musicplay.MusicPlayControllor asInterface(android.os.IBinder obj)
{
   if (((iin!=null)&&(iin instanceof com.fanfan.aidl.musicplay.MusicPlayControllor))) {
      return ((com.fanfan.aidl.musicplay.MusicPlayControllor)iin);
   }
  return new com.fanfan.aidl.musicplay.MusicPlayControllor.Stub.Proxy(obj);
}

另外一个进程的客户端通过该代理,扩展该代理Stu.Proxy(obj);即可调用服务端下的所有方法。

▲☆实现步骤:
§服务端
1、在服务端定义 ***.aidl文件(定AIDL接口)
2、在Service中的onBind方法返回AIDL.Stub类的对象
3、在注册Service时,指定一个隐式意图;

<action android:name="com.fanfan.action.MUSIC_PLAYER_SERVICE"/>

▲☆客户端:
1、创建与服务端一样的AIDL接口,包名必须一样。
2、创建ServiceConnection对象,在其onServiceConnected方法中将参数IBinder对象传入到AIDL接口.Stub.asInterface方法中作参数获得一个AIDL接口对象,如

1、创建与服务端一样的AIDL接口,包名必须一样。
2、创建ServiceConnection对象,在其onServiceConnected方法中将参数IBinder对象传入到AIDL接口.Stub.asInterface方法中作参数获得一个AIDL接口对象,如 : controllor = MusicPlayControllor.Stub.asInterface(binder);
3 、 用service注册时的action创建要绑定的Service:
Intent intent = new Intent("com.fanfan.action.MUSIC_PLAYER_SERVICE");
4、调用bindService方法绑定到Service: bindService(intent, conn, BIND_AUTO_CREATE);
5、通过AIDL接口对象去调用服务端的方法
6、在onDestroy方法中解除绑定:unbindService(conn);

◆电话操作:
通话记录管理:
相关表:
calls : _id number duration date type(对应的 有:Calls.INCOMING_TYPE、Calls.MISSED_TYPE、Calls.OUTGOING_TYPE)
★ 相关的API: CallLog Calls
▲呼出电话的监听
当电话呼出时,会发送一个系统广播Intent.ACTION_NEW_OUTGOING_CALL
可以在广播中获取呼出号码的信息。
1)getResultData()
2)intent.getStringExtra(Intent.EXTRA_PHONE_NUMBER);

★☆无法使用abortBroadcast()取消通话,但可使用setResultData(null)取消,也可用setResultData("18545006310")将呼出电话进行更改;
使用权限:android.permission.PROCESS_OUTGOING_CALLS
在真机上还需权限:android:name="android.permission.READ_CONTACTS"
▲呼入电话的监听:
1、获取TelephoneManager实例:tm = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);
2、可通过tm获得关于手机许多信息:

tm.getCallState()); //通话状态 空闲(TelephonyManager.CALL_STATE_IDLE) 摘机(占线) TelephonyManager.CALL_STATE_OFFHOOK、响铃TelephonyManager.CALL_STATE_RINGING;
tm.getCellLocation());// 通话位置,开了gps可获取精确位置,否则是模糊位置
tm.getDeviceId());//设备ID
tm.getDeviceSoftwareVersion());
tm.getLine1Number()); // 本机号码;
tm.getNetworkCountryIso());//
tm.getNetworkOperator());// 手机运营商
tm.getNetworkOperatorName());//运营商名
tm.getPhoneType());//手机电话类型,GSM/CDMA
tm.getSimCountryIso());// sim卡信息
tm.getSimSerialNumber());// sim卡序列号;
tm.getSubscriberId());// sim卡识别序列码子码
tm.isNetworkRoaming());// 是否支持漫游
tm.getNetworkType());// 网络类型;
tm.getVoiceMailAlphaTag());//信箱类型
tm.getVoiceMailNumber());// 音量

★№ 要监听呼入电话
可在一个Service中创建一个电话监听器: listener = new PhoneStateListener() {} 包含许多可回调的方法,若只监听通话状态,可重写onCallStateChanged(..)方法;
利用电话管理器对电话进行监听:tm.listen(listener, PhoneStateListener.LISTEN_CALL_STATE);//第二个参数为要监听的状态
必须在onDestroy方法中取消该监听,否则会出现内存泄露:

tm.listen(listener, PhoneStateListener.LISTEN_NONE);
  //参数为NONE时表示什么都不监听,即可取消监听器。

★☆ 挂断:需要取出系统类ITelephony,该类包含对呼入电话的许多方法,但在系统被标记为{@hide},即被隐藏,若需要获取此实例,须导入相关的AIDL接口文件,并利用反射机制获得相关方法;

 Method method = Class.forName("android.os.ServiceMananger")// 需要要加载的类名.getDeclaredMethod("getService",String.class);//需要调用方法名和需要的参数
IBinder binder = (IBinder) method.invoke(null,TELEPHONY_SERVICE);// 参数分别为接收的对象和参数名 
ITelephony tle = ITelephony.Stub.asInterface(binder); // 通过AIDL获得Service为本地代理 // 调用ITelePhony下的方法 // tle.call(number); //拨打电话,需要root // tle.answerRingingCall();//接听电话,需要root
tle.endCall();// 挂断电话,可用于防骚扰;

博客地址:Android学习笔记(七)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容