導航:首頁 > 操作系統 > androidaidleclipse

androidaidleclipse

發布時間:2022-10-01 17:11:14

⑴ 如何對系統調用了aidl文件進行避免混淆

建立AIDL服務要比建立普通的服務復雜一些,具體步驟如下:

(1)在Eclipse android工程的java包目錄中建立一個擴展名為aidl的文件。該文件的語法類似於Java代碼,但會稍有不同。詳細介紹見實例52的內容。
(2)如果aidl文件的內容是正確的,ADT會自動生成一個Java介面文件(*.java)。
(3)建立一個服務類(Service的子類)。
(4)實現由aidl文件生成的Java介面。
(5)在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標簽中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類的參數值。

建立AIDL服務

本例中將建立一個簡單的AIDL服務。這個AIDL服務只有一個getValue方法,該方法返回一個String類型的值。在安裝完服務後,會在客戶端調用這個getValue方法,並將返回值在TextView組件中輸出。建立這個AIDL服務的步驟如下:
(1)建立一個aidl文件。在Java包目錄中建立一個IMyService.aidl文件。IMyService.aidl文件的位置如圖

IMyService.aidl文件的內容如下:
Java代碼:
package eoe.demo;
interface IMyService {
String getValue();
}

IMyService.aidl文件的內容與Java代碼非常相似,但要注意,不能加修飾符(例如,public、private)、AIDL服務不支持的數據類型(例如,InputStream、OutputStream)等內容。

(2)如果IMyService.aidl文件中的內容輸入正確,ADT會自動生成一個IMyService.java文件。讀者一般並不需要關心這個文件的具體內容,也不需要維護這個文件。關於該文件的具體內容,讀者可以查看本節提供的源代碼。
(3)編寫一個MyService類。MyService是Service的子類,在MyService類中定義了一個內嵌類(MyServiceImpl),該類是IMyService.Stub的子類。MyService類的代碼如下:

Java代碼:
package eoe.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public String getValue() throws RemoteException {
return "Android/OPhone開發講義";
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();
}
}

在編寫上面代碼時要注意如下兩點:

IMyService.Stub是根據IMyService.aidl文件自動生成的,一般並不需要管這個類的內容,只需要編寫一個繼承於IMyService.Stub類的子類(MyServiceImpl類)即可。

onBind方法必須返回MyServiceImpl類的對象實例,否則客戶端無法獲得服務對象。

(4)在AndroidManifest.xml文件中配置MyService類,代碼如下:

Java代碼:
<service android:name=".MyService" >
<intent-filter>
<action android:name="net.blogjava.mobile.aidl.IMyService" />
</intent-filter>
</service>

下面來編寫客戶端的調用代碼。首先新建一個Eclipse Android工程(ch08_aidlclient),並將自動生成的IMyService.java文件連同包目錄一起復制到ch08_aidlclient工程的src目錄中,如圖所示。

調用AIDL服務首先要綁定服務,然後才能獲得服務對象,代碼如下:

Java代碼:
package net.blogjava.mobile;
import net.blogjava.mobile.aidl.IMyService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle; import android.os.IBinder;
import android.view.View; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.TextView;
public class Main extends Activity implements OnClickListener {
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 獲得服務對象
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBindAIDLService:
// 綁定AIDL服務
bindService(new Intent("net.blogjava.mobile.aidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try {
textView.setText(myService.getValue());
// 調用服務端的getValue方法
} catch (Exception e) {
}
break;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService); btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}。

⑵ android framework aidl生成文件在哪

建立AIDL服務要比建立普通的服務復雜一些,具體步驟如下:

(1)在Eclipse Android工程的Java包目錄中建立一個擴展名為aidl的文件。該文件的語法類似於Java代碼,但會稍有不同。詳細介紹見實例52的內容。
(2)如果aidl文件的內容是正確的,ADT會自動生成一個Java介面文件(*.java)。
(3)建立一個服務類(Service的子類)。
(4)實現由aidl文件生成的Java介面。
(5)在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標簽中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類的參數值。

⑶ 遷移一個eclipse工程到AndroidStudio有哪些坑

首先,我們來看一下把一個eclipse工程遷移到AndroidStudio有幾種方法:
方法1:直接導入一個eclipse工程;
方法2:在eclipse中利用ADT為工程生成一個Gradle文件,AndroidStudio導入這個gradle工程;
方法3:在AndroidStudio中新建一個工程,把eclipse工程的代碼、資源一點點拷過來;
1
採用哪種方法
先說結論:我採用了方法3,如果你對方法1和方法2的效果不感興趣,可以跳過這一部分。
方法1的好處是簡單,AndroidStudio的早期版本只能用方法2,現在的新版可以支持方法1,直接導入一個eclipse工程,我開始時也是試這種方法的,確實簡單,導進來不需要做任何設置居然就能運行,那麼問題是什麼呢?問題是編譯運行一次那叫一個慢呀,比eclipse還慢N倍,而且異常消耗電腦資源,我們Macbook Pro配置不算低,買來一年多風扇從來沒響過,以至於我以為電腦根本沒有風扇,這下是聽到風扇響了,響聲那叫一個大,說明這種構建項目的方式極其耗內存耗CPU,並且由於沒有gradle文件,Gradle的所有特性全部用不上,我都懷疑這種編譯方式用的就是ant,根本沒用到gradle。
綜上所述,方法1既沒有eclipse快,也沒有AndroidStudio的好處,看來這種方法不可取。
再來看方法2,方法2是Google官方推薦的方式,操作步驟是:先在eclipse中的工程上點滑鼠右鍵,在彈出的菜單中選擇Export...,然後在彈出的窗口中選擇Android標簽下的Generate Gradle build files,如下圖所示:

然後按提示操作就可以在工程目錄下生成一個build.gradle文件,之後我們就可以用AndroidStudio導入這個build.gradle文件了,導入的過程中會連同這個工程一齊導入,之後,就會看到導入後的工程了,如圖所示:

看到了吧,整個工程還是保持eclipse中的目錄結構。
右邊是eclipse自動生成的build.gradle文件的內容,跟代碼無關。並且只有一個build.gradle文件,沒有分全局的gradle和模塊的gradle,使用了很舊的Gradle版本,並且使用已經不建議的android插件,之所以工程目錄沒有使用AndroidStudio默認格式,而可以保持eclipse目錄結構,都是因為gradle文件中的那一部分sourceSets下的配置,sourceSets的配置可以允許我們改變工程的目錄組織結構,而不需要必須使用AndroidStudio的默認結構,而且build.gradle構建一直不成功。。。也是醉了。
由於存在這么多的疑問,我擔心會給將來留坑,並且目錄結構都不是AndroidStudio默認,我決定:放棄這種方法,採用方法3:新建一個AndroidStudio工程,把代碼和資源一點一點拷過去,使用「純粹」的AndroidStudio開發方式。
2

採用方法3把工程遷移到AndroidStudio

這種方法的過程也沒什麼好講的,就是把java代碼和資源文件復制粘貼到新工程的目錄下就OK了,先來看一下效果,下圖是我遷移完的效果:

怎麼樣,是不是清爽了許多,目錄結構完全是AndroidStudio的格式,首先一個注意的問題就是公司以前的項目是沒有用到v7包的,所以在build.gradle中注釋掉這個maven引用,以免引起不必要的麻煩。
還有一點就是以前項目中是有jni代碼的,但是我們的jni代碼目錄組織結構比較復雜,不是標準的jni目錄,AndroidStudio又不是靠mk文件來配置C代碼,所以還沒搞定,暫時只是把so包拿過來用,C代碼的編譯還是在eclipse下進行,將來搞定了我再回來給大家補充。下面把我的修改過程一一講述一下:
1、注釋掉build.gradle中v7包的引用。
這個上面已經說過了,因為項目中以前沒用到v7包;
2、遷移AIDL文件。
如果你的項目中沒有用到AIDL,那你可以跳過這部分。在eclipse中,aidl文件是跟java文件放在同一個包下的,但是AndroidStudio要求aidl文件默認放在模塊下的src/main/aidl文件夾下,並且包名要與以前在java包下的包名、路徑相同。
比如以前aidl文件在com.example.mycode包下邊,那麼你也要在aidl文件夾下建這樣一個同名的包,把aidl文件移過去,如果沒有aidl文件夾,那就點右鍵新建一個,效果如下圖所示:

--aidl目錄沒有就新建一個--

--aidl文件的位置擺放--
如果aidl文件擺放不正確,java中引用service的類就會報錯,aidl文件默認是放在這里的,當然也可以通過配置build.gradle文件來使它們跟java代碼混在一起,但是不建議這樣做,我們盡量按照 AndroidStudio的默認配置來做;
3、修改AndroidManifest.xml文件
我在進行完以上步驟後嘗試同步gradle配置,結果報了
Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs
這個錯誤,如下圖所示

--報Manifest merger failed錯誤--
merger是合並的意思嘛,開始覺得很奇怪,我們工程又沒有Library引用,跟誰合並呢,後來想起來build.gradle中引用了v7包,但是把v7包的引用注釋掉還是不行,有網友說在manifest中使用tools:replace標簽,可能這種方式只適用於Library模塊引起的merger沖突,我的很顯然不是這種情況;還有網友說在build.gradle的android標簽下加入aaptOptions.cruncherEnabled false和aaptOptions.useNewCruncher false,開始時管了點用,後來多試幾次又不行,看來也不是這個問題。
後來用了一個笨辦法,一點一點注釋AndroidManifest.xml中的內容,看看注釋掉哪一塊可以不報錯,結果發現是下圖中所示的原因:

--intent-filter標簽是一個空標簽--
上圖中,我的service下配置了intent-filter標簽,按理說intent-filter標簽下還應該有action子標簽,比如像下圖這樣的標准寫法:

--網路定位SDK的寫法是標准寫法--
所以,我們要做的就是注釋掉AndroidManifest.xml中service標簽下的空的intent-filter標簽,至少我用這種方法處理後就不再報錯了,看來AndroidStudio完全是一套新的api,跟以前的開發方式都不一樣了;
此外,由於版本號等配置在build.gradle文件中已經有了,所以我們在AndroidManifest.xml文件中要刪掉重復的配置;
4、圖片資源引用問題
經過以上幾步修改後,項目終於可以編譯運行了,但是悲劇也發生了,一打開app立馬閃退,報的錯誤是:
java.lang.RuntimeException: Unable to start activity
ComponentInfo{com.xxxxx.xx/com.xxxxx.xx.xxxxx.MainActivity}:
android.view.InflateException: Binary XML file line #2: Error
inflating class android.widget.RelativeLayout

報錯的地方就在Activity的onCreate方法中的setConentView方法處,什麼原因呢?
原因是我們在build.gradle中buildToolsVersion配置的版本過低,我一直在用19.1.0,在這個版本下,要求所有圖片必須放在mipmap目錄下才能在布局文件中引用,否則就會引起上述Activity閃退,當我把buildToolsVersion的版本改成23.0.2之後就可以引入放在drawable目錄下的圖片了,如下圖所示:

--buildToolsVersion建議用較新版本--
還有的同學說這個錯誤是因為圖片資源不符合規范,有些本來是jpg圖片,只是把擴展名改成了png就拿來用,其實這個問題會導致build同步失敗,根本就不可能讓應用跑起來,關於這個問題,建議批量修改圖片資源,把所有的圖片都改成png格式,網上有很多修改圖片的工具,但是mac操作系統下有一個現成的方法,不需要安裝任何第三方軟體就可以批量改圖片格式,具體操作方法如下:
5、圖片資源不規范導致同步gradle失敗的解決方法(Mac操作系統)
(1)進入圖片目錄,按command+A選中所有圖片,然後右鍵菜單選擇打開方式->選擇「預覽」這個應用程序,這個程序是Mac操作系統自帶的,如下圖所
示:

--用預覽打開圖片--
(2)打開「預覽」之後,點左上角的「顯示」,勾選「縮略圖」,就可以在預覽窗口左側看到所有圖片的縮略圖了,如下圖所示:

--勾選「縮略圖」--
(3)在縮略圖區域的空白處點滑鼠右鍵,勾選排序菜單中的「種類」,按種類排序,如下圖所示:

--所有圖片按種類排序--
然後你就可以看到下圖所示的情景:

--假的png圖片被找了出來--
(4)將jpg圖片重新導出為png圖片,方法是在圖片上點滑鼠右鍵(如果有多張圖片想批量導出的話按住command鍵點滑鼠進行多選,或者直接按command+A全選所有圖片),選擇「導出為...」, 在彈出的對話框中選擇PNG類型,如下圖所示

--將圖片導出為PNG格式--
這樣就可以將不符合規范的圖片規范化了。
這里之所以用Mac來講是因為Windows下圖片轉換的工具有很多,一抓一大把,但是Mac中這類工具卻相對較少,為了讓大家少走彎路,分享一下Mac的圖片轉換方法,其實我也是在網路上找的,忘記哪個網站了,感謝那位朋友的無私分享。
6、jar包和so包應該放在哪?
在eclipse中,so包和jar都是放在lib目錄下的,那麼在AndroidStudio中是不是這樣呢?當然不是的。
(1)首先看jar應該放在哪?jar包應該放在模塊下的libs目錄下,如圖所示:

--jar包的位置--
然後就可以了,因為在新建工程的時候,系統已經在build.gradle中自動為我們配置了jar包的位置,如圖所示:

--build.gradle中關於jar包位置的默認配置--
所以我們不需要再配了,直接把jar包拷在libs目錄下就可以用;
(2)言歸正轉,so包應該放在哪呢?AndroidStudio默認的so存放位置是模塊下的src/main/jniLibs目錄,如圖所示:

--so包應該放在jniLibs目錄下--
如圖所示,so包不能像在eclipse中那樣跟jar包放在一起(默認情況下),如果沒有jniLibs目錄就自己建一個。
其實無論是aidl文件的存放位置,還是so包的存放位置,都是可以通過build.gradle文件修改的,這個不是今天的重點,大家有興趣可以自行搜索相關資料,我們盡量遵循AndroidStudio的默認方式,以便讓別人看到我們的項目時不至於一頭霧水。
7、最後就是jni源碼的存放位置以及如何配置了。

⑷ 為什麼 aidl 總是出現null

建立AIDL服務要比建立普通的服務復雜一些,具體步驟如下:

(1)在Eclipse Android工程的Java包目錄中建立一個擴展名為aidl的文件。該文件的語法類似於Java代碼,但會稍有不同。詳細介紹見實例52的內容。
(2)如果aidl文件的內容是正確的,ADT會自動生成一個Java介面文件(*.java)。
(3)建立一個服務類(Service的子類)。
(4)實現由aidl文件生成的Java介面。
(5)在AndroidManifest.xml文件中配置AIDL服務,尤其要注意的是,<action>標簽中android:name的屬性值就是客戶端要引用該服務的ID,也就是Intent類的參數值。

建立AIDL服務

本例中將建立一個簡單的AIDL服務。這個AIDL服務只有一個getValue方法,該方法返回一個String類型的值。在安裝完服務後,會在客戶端調用這個getValue方法,並將返回值在TextView組件中輸出。建立這個AIDL服務的步驟如下:
(1)建立一個aidl文件。在Java包目錄中建立一個IMyService.aidl文件。IMyService.aidl文件的位置如圖

IMyService.aidl文件的內容如下:
Java代碼:
package eoe.demo;
interface IMyService {
String getValue();
}

IMyService.aidl文件的內容與Java代碼非常相似,但要注意,不能加修飾符(例如,public、private)、AIDL服務不支持的數據類型(例如,InputStream、OutputStream)等內容。

(2)如果IMyService.aidl文件中的內容輸入正確,ADT會自動生成一個IMyService.java文件。讀者一般並不需要關心這個文件的具體內容,也不需要維護這個文件。關於該文件的具體內容,讀者可以查看本節提供的源代碼。
(3)編寫一個MyService類。MyService是Service的子類,在MyService類中定義了一個內嵌類(MyServiceImpl),該類是IMyService.Stub的子類。MyService類的代碼如下:

Java代碼:
package eoe.demo;
import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
public class MyService extends Service {
public class MyServiceImpl extends IMyService.Stub {
@Override
public String getValue() throws RemoteException {
return "Android/OPhone開發講義";
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyServiceImpl();
}
}

在編寫上面代碼時要注意如下兩點:

IMyService.Stub是根據IMyService.aidl文件自動生成的,一般並不需要管這個類的內容,只需要編寫一個繼承於IMyService.Stub類的子類(MyServiceImpl類)即可。

onBind方法必須返回MyServiceImpl類的對象實例,否則客戶端無法獲得服務對象。

(4)在AndroidManifest.xml文件中配置MyService類,代碼如下:

Java代碼:
<service android:name=".MyService" >
<intent-filter>
<action android:name="net.blogjava.mobile.aidl.IMyService" />
</intent-filter>
</service>

下面來編寫客戶端的調用代碼。首先新建一個Eclipse Android工程(ch08_aidlclient),並將自動生成的IMyService.java文件連同包目錄一起復制到ch08_aidlclient工程的src目錄中,如圖所示。

調用AIDL服務首先要綁定服務,然後才能獲得服務對象,代碼如下:

Java代碼:
package net.blogjava.mobile;
import net.blogjava.mobile.aidl.IMyService;
import android.app.Activity;
import android.content.ComponentName;
import android.content.Context;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle; import android.os.IBinder;
import android.view.View; import android.view.View.OnClickListener;
import android.widget.Button; import android.widget.TextView;
public class Main extends Activity implements OnClickListener {
private IMyService myService = null;
private Button btnInvokeAIDLService;
private Button btnBindAIDLService;
private TextView textView;
private ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
// 獲得服務對象
myService = IMyService.Stub.asInterface(service);
btnInvokeAIDLService.setEnabled(true);
}
@Override
public void onServiceDisconnected(ComponentName name) {
}
};
@Override
public void onClick(View view) {
switch (view.getId()) {
case R.id.btnBindAIDLService:
// 綁定AIDL服務
bindService(new Intent("net.blogjava.mobile.aidl.IMyService"), serviceConnection, Context.BIND_AUTO_CREATE);
break;
case R.id.btnInvokeAIDLService:
try {
textView.setText(myService.getValue());
// 調用服務端的getValue方法
} catch (Exception e) {
}
break;
}
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
btnInvokeAIDLService = (Button) findViewById(R.id.btnInvokeAIDLService);
btnBindAIDLService = (Button) findViewById(R.id.btnBindAIDLService); btnInvokeAIDLService.setEnabled(false);
textView = (TextView) findViewById(R.id.textview);
btnInvokeAIDLService.setOnClickListener(this);
btnBindAIDLService.setOnClickListener(this);
}
}

轉載僅供參考,版權屬於原作者。祝你愉快,滿意請採納哦

⑸ 怎麼將android加入eclipse

具體來說,有兩種方式。

第一種:在你創建android project 的時候在選擇

Create project from existing source 按後選

Browse 在你的電腦裡面找到要引入的代碼。

第二種:可以建立一個Applocation name

Package name

Create Activity

還有 android版本相同的項目

建立以後,點右鍵選擇Import 再選File System

找到要引入的項目,把裡面的東西都引入進來就可以了。

學習android的源碼,比如Browser(瀏覽器)、Mms(彩信/簡訊)、Phone(電話)、Contacts(聯系人)在eclipse里可能會有錯誤,原因可能有下邊幾個:

1、使用到了未包括在SDK中(公開發布)的API,有兩種情況:

a 被 @hide 標注了的類:這 些類是被隱藏起來的,這些類大多都在com.android.internal包下面;

b 一些未包括在SDK中的、Google私有的Api,它們大多都在com.google.android包下面

2、使用了一些由framework層聲明的aidl介面訪問系統服務,然而這些aidl在編譯時才會轉換成.java源碼,因此在SDK環境下編譯這些應用時無法訪問到它們。

解決方法是:

(請注意:out目錄 是在完整源碼編譯環境下(Linux下),執行一次完整編譯後的輸出目錄)

1、找到那些被隱藏起來的類、它們在以下兩個位置:

A、out argetcommonobjJAVA_LIBRARIESframework_intermediates/ classes.jar ;

B、out argetcommonobjJAVA_LIBRARIESandroid-common_intermediates classes.jar ;

將找到的.jar文件,在Eclipse中作為User Library 添加到 Project 的Librarys依賴中,並將該庫的順序置於Android SDK Library之上。

在 out argetcommonobjJAVA_LIBRARIES 目錄下,還有很多其它具體應用相關的jar包,.... ;

2、找到那些缺失的、編譯時才生成的,.java源文件,它們通常在以下位置:

A、 out argetcommonobjJAVA_LIBRARIESXXX _intermediatessrc 目錄下,XXX是相關模塊的名稱;

將找到的src目錄,在Eclipse下,以Link Source的方式,連接到Project 中作為源碼的一部分。

⑹ android 如何讓兩個apk相互通信

A.apk,B.apk都是我寫的.現在我想在B.apk里實現獲得A.apk的某控制項ID,並向其發送一個按鍵事件.如何實現,謝謝!也就是用B控制A.

這兩個apk 是在兩個進程里的,(或許可以配置成一個進程。不過如何直接操作這個沒有試過。)

所以一般的有兩種方法:
1、RPC
2、通過 BroadcastRecever 或 Service

第二種方法比較簡單一些。
比如B 控制 A的話,
A定義Service ,比如com.my.ServerA .自定義actionFilter 「com.my.serverA.action"
B中調用Intent it = newIntent("com.my.serverA.action");
it.putExtra(....);// 傳遞你的自定義控制指令。
B.startService(it);
在A中ServerA的 onStartService(Intent it) 。解析這個控制指令,做相應操作就可以了。

用BroadcastRecever 的道理一樣。

Aidl,android平台的IPC方式之一,基於系統的Ibinder機制。
網上大多數例子都是在一個apk下來測試調用service,現在我在兩個project下面來調用。
一個是server project,一個是client project
首先我們建立的是server project,這裡面要實現aidl文件和一個service,activity只是用來啟動service的,當然,你也可以通過發廣播的形式來啟動service。
首先看IAidlService.aidl文件:

Java代碼
package com.ds.server;
interface IAidlService {
int getType();
}

這樣在eclipse裡面自動編譯的時候會在gen下面生成IAidlService.java文件(燈下我們的client project要用)。
然後新建一個service,這個service裡面has a IAidlService的stub對象,service具體代碼如下:

Java代碼
package com.ds.server;

import android.app.Service;
import android.content.Intent;
import android.os.IBinder;
import android.os.RemoteException;
import android.util.Log;

public class AidlService extends Service {

private IAidlService.Stub mBinder = new IAidlService.Stub() {

@Override
public int getType() throws RemoteException {
// TODO Auto-generated method stub
return 5;
}
};

private void Log(String str) {
Log.d("AidlService", "------ " + str + "------");
}

@Override
public void onCreate() {
Log("service create");
}

@Override
public void onStart(Intent intent, int startId) {
Log("service start id=" + startId);
}

@Override
public IBinder onBind(Intent t) {
Log("service on bind");
return mBinder;
}

@Override
public void onDestroy() {
Log("service on destroy");
super.onDestroy();
}

@Override
public boolean onUnbind(Intent intent) {
Log("service on unbind");
return super.onUnbind(intent);
}

public void onRebind(Intent intent) {
Log("service on rebind");
super.onRebind(intent);
}

}

這里一定要實現onBind方法,並返回一個IAidlService.Stub對象。
再去AndroidManifest.xml注冊這個service:

Xml代碼
<service
android:name=".AidlService"
android:enabled="true"
android:process=":remote" >
<intent-filter>
<action android:name="com.ds.server.IAidlService" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</service>

android:enabled="true"
android:process=":remote"這兩個標簽可有可無。
只要注冊了這個service就行。
好了,到此,服務端已經完成。

-------------------華麗的分割線-----------------------------------------

下面我們開始client project。
client project比較簡單,需要注意的地方是,首先需要把server project中gen文件夾中aidl生成的那個IAidlService.java類以及包都拷貝到我們的client project中。
(注意:client project的包名為com.ds.client;另外一個包名com.ds.server以及這個server包下面的IAidlService.java類都是從server project的gen文件夾拷貝過來的,至於gen文件夾的其他文件就不需要拷貝過來。)。
好了,這樣的話,client project只要從activity去遠程調用service就好了,實現代碼如下:

Java代碼
package com.ds.client;

import com.ds.server.IAidlService;

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.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.TextView;

public class AidlClientActivity extends Activity {

IAidlService iservice;

private ServiceConnection connection = new ServiceConnection() {

public void onServiceConnected(ComponentName name, IBinder service) {
// TODO Auto-generated method stub
// 從遠程service中獲得AIDL實例化對象
iservice = IAidlService.Stub.asInterface(service);
Log.i("Client","Bind Success:" + iservice);
}

public void onServiceDisconnected(ComponentName name) {
// TODO Auto-generated method stub
iservice = null;
Log.i("Client","onServiceDisconnected");
}
};

/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
final TextView tv = (TextView) findViewById(R.id.tv);
Button bt = (Button) findViewById(R.id.bt);
bt.setOnClickListener(new OnClickListener() {

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);
if (iservice != null) {
try {
tv.setText("" + iservice.getType());
} catch (RemoteException e) {
e.printStackTrace();
}
}

}

});

}
}

注意幾點:
1,import com.ds.server.IAidlService;使用的是我們拷貝過來的IAidlService.java類
2,需要一個ServiceConnection對象
3,通過Intent service = new Intent(IAidlService.class.getName());
bindService(service, connection, BIND_AUTO_CREATE);來bind service。這樣就可以調用aidl中定義的介面來獲取service中的值了。

唉,由於在使用中沒有注意拷貝server project中gen文件夾下面的包和IAidlService.java,老是出現Unable to start service Intent這樣的錯誤。搞了好久。
附件是源碼。注意使用的時候,先要運行server project,啟動服務,然後再運行client project。

閱讀全文

與androidaidleclipse相關的資料

熱點內容
五菱宏光空調壓縮機 瀏覽:64
為什麼app佔用幾百兆 瀏覽:676
自動解壓失敗叫我聯系客服 瀏覽:482
易語言新手源碼 瀏覽:456
oa伺服器必須有固定ip地址 瀏覽:42
傳奇源碼分析是什麼 瀏覽:267
解放壓縮機支架 瀏覽:255
程序員禿頂搞笑相遇 瀏覽:6
IBM手機app商店叫什麼名字 瀏覽:834
jpeg壓縮質量 瀏覽:774
雲伺服器評測對比 瀏覽:145
java日期轉string 瀏覽:221
openfire源碼編譯 瀏覽:897
在線小工具箱引流網站源碼 瀏覽:337
非科班程序員自學 瀏覽:801
壓縮泡沫鞋底底材 瀏覽:219
程序員職場第一課2正確的溝通 瀏覽:679
遇到不合法app應該怎麼辦 瀏覽:91
匯編程序編譯後的文件 瀏覽:81
大智慧均線源碼 瀏覽:374