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學習筆記(七)

發佈了46 篇原創文章 · 獲贊 7 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章