安卓多程序通信主要有四大方案:1,Activity 2,Broadcast Receiver 3,Content Prodiver 4,Service
1,Activity
Intent intent = new Intent();
intent.setAction(Intent.ACTION_CALL);
intent.setData(Uri.parse("tel:18702531326"));
startActivity(intent);
打電話的權限uses-permission android:name="android.permission.CALL_PHONE"/
目前應用和手機本身的打電話子產品是兩個程序,通過設定Action和傳遞資料給系統打電話子產品就可以将電話号碼跨程序傳遞
2,Broadcast Receiver
這個更好了解了,廣播分标準和有序,即異步和同步,每個訂閱了廣播的接受者的能收到資料(沒有被攔截),但這個方式是被動的,它們無法互動,對于絕大多數的業務需求來說都需要請求網絡資料并計算傳回
3,Content Prodiver
内容提供者,安卓四大元件之一,在應用A中建立一個SharedPreferences并寫入資料設定權限為Context.MODE_WORLD_READABLE,這樣應用B通過A的包名和Key就可以通路這個資料,但是官方已不太建議使用這種方式,它不是程序安全的。
4,Service
Aidl目前來說是多程序普遍運用的技術,那麼下面看一下通過Aidl怎麼實作程序通信
程序通信肯定有傳輸資料和接受并返還資料,先建立兩個項目,一個為AidlDemo1作為Service,另一個為AidlDemo2作為Client
先把Service項目切換到Android模式下,然後再建立aidl檔案夾
建立aidl檔案夾
在aidl檔案夾下建立包名
建立aidl檔案
切記字尾名 .aidl
Aidl源碼如下
編寫供Client項目調用的Service
把aidl匿名實作類指派給iBinder
把Service項目中的aidl檔案拷貝到Client項目,切記包名和檔案名必須一緻,然後再同步項目
private IMyAidlInterface iMyAidlInterface;
private ServiceConnectionconn=newServiceConnection() {
@Override
//當Service綁定并連接配接成功後調用,此時的service參數是Service項目傳回的aidl實作
public void onServiceConnected(ComponentName name,IBinder service) {
iMyAidlInterface= IMyAidlInterface.Stub.asInterface(service);
}
//斷鍊時清空,節約記憶體
public void onServiceDisconnected(ComponentName name) {
iMyAidlInterface=null;
};
private void initService() {
Intent intent =new Intent();
//第一個參數是Service項目中的MyService所屬包名,第二個為MyService的全路徑名稱
intent.setComponent(newComponentName("com.example.administrator.aidldemo1",
"com.example.administrator.aidldemo1.MyService"));
//安卓5.0以後不允許隐式啟動Service
intent.setAction("aidl");
bindService(intent,conn,Context.BIND_AUTO_CREATE);
調用aidl
iMyAidlInterface.getCount(num1,num2);
最後别忘了解綁服務
protected voidonDestroy() {
super.onDestroy();
unbindService(conn);
在運作Client項目時可能會報aidl方法無法找到的異常,此時隻需要cliean Project,然後同步一下,運作即可
下一篇寫Aidl的複雜資料類型傳遞以及aidl的原了解析
如有不當,歡迎留言。