您好,登錄后才能下訂單哦!
上次我給大家介紹了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進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。