上次我給大家介紹了Service的基本用法,其中有提到過如何訪問自身app的Service,現在我來為大家介紹如何訪問其他app的Service
1:創建一個安卓項目app1并且新建一個service,在Service清單文件中配置訪問此服務所需要的過濾條件
清單代碼如下
<service
android:name="com.example.aidl.MyService"
android:enabled="true"
android:exported="true"
>
<intent-filter >
<action android:name="org.yi.Action"/>
</intent-filter>
</service>2:創建一個接口IMybinder,然后隨便寫個方法,寫完后把修飾接口的public刪掉,
interface IMyBinder {
void start();
}然后找到接口文件所在的文件目錄,將文件后綴名改為aidl然后回到想到項目刷新,這時候gen目錄會自動生成一個IMyBind的java文件,如下圖(萬惡的水印。。。)

3:在創建一個app2項目(用來啟動app1中Service的方法),將aidl后綴的文件拷貝到app2項目里面來(記住拷貝的aidl所放在的包名要跟原來的一樣)

4: 回到app1的service中寫一個內部類繼承IMybinder.stub,重寫start()方法里面調用Service的方法,然后在Service的onBind方法返回一個Mybinder對象
(如下圖中play()方法是在Service里面的,然后在play方法里面打個日志已便檢查是否調用成功)
class MyBinder extends IMyBinder.Stub
{
public void start()
{
play();
}
}
@Override
public IBinder onBind(Intent intent) {
return new MyBinder();
}
public void play()
{
Log.e("MyService", "這是app1中Service的play方法");
}5:在app2中放入一個按鈕并在監聽事件中調用app1中服務的方法
//利用intent的隱式意圖啟動另外一個app的服務
findViewById(R.id.button1).setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Intent service = new Intent();
service.setAction("org.yi.Action");
bindService(service , conn , Context.BIND_AUTO_CREATE);
}
});6:conn接口對象中的onServiceConnected方法中取得IMyBnder對象并調用start方法,代碼如下
private ServiceConnection conn = new ServiceConnection() {
private IMyBinder mBinder;
@Override
public void onServiceDisconnected(ComponentName name) {
}
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
//取得IMyBinder對象
mBinder = IMyBinder.Stub.asInterface(service);
try {
mBinder.start();
} catch(RemoteException e) {
e.printStackTrace();
}
}
};大功告成,先運行app1來啟動服務,然后在app2中點擊按鈕調用app1中service的方法,結果如下
這里的調用比較復雜需要在2個app中來回寫方法,我會把這次的源代碼上傳到我的上傳(名字為博客標題),有需要的可以去下載。Service基本就說到這,下次我為大家介紹安卓第三大組件BroadCastReceiver(廣播機制)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。