看板 AndroidDev 關於我們 聯絡資訊
大家好,我的問題是 某程式( Service ),透過 bindService 去呼叫 另一個「不同 App」的 Service , 該如何做互動,情境如下: FloatWindow - 是一個 Service , 透過 WindowManager 建立了一個 浮動視窗。 MyService - 是要呼叫 FloatWindow 的「呼叫者」 , 透過 bindService ( FloatWindow 的 AndroidManifest.xml 有宣告 export=true ) 想先請問第一個問題是, MyService 可以存取 FloatWindow 的 public member 吧? 我有沒有辦法反過來, FloatWindow 去存取 MyService 的成員呢? 第二個問題比較複雜.... 根據網路上所述, FloatWindow 時做一個 LocalBinder , 提供一個方法 return FloatWindow 這個 Service。 我的目的是在 MyService 裡面有宣告一個 Listener , 想透過 Binder 把 Listener 傳過去給 Service,這樣當我這個 FloatWindow 視窗上的 東西被按下時,能夠呼叫到這個 Listener 執行事件。 public class FloatWindow extends Service{ private IBinder mBinder=new LocalBinder(); private MyListener listener; public IBinder onBind(Intent intent){ return mBinder; } public class LocalBinder extend Binder{ public FloatWindow getService(){ return FloatWindow.this; } } public void setListener(MyListener l){ listener=l; } } 而在 MyService 透過 bindService 呼叫: Intent intent=new Intent(); intent.setComponent(/*有寫好,先略*/); bindService(intent,svrCon, Service.BIND_AUTO_CREATE); 而 svrCon 是這個的 instance: public class SvrCon implements ServiceConnection { @Override public void onServiceConnected(ComponentName name, IBinder service) { FloatWindow f=((FloatWindow.LocalBinder)service).getService(); f.setListener( listener_instance ); } @Override public void onServiceDisconnected(ComponentName name) { } } 上面這個是我研究出來的方式,應該是這樣用吧。 只是我現在狀況更加複雜,就是這兩個 Service 是在不同 Process 中, 根據網路上的說明,要用到 AIDL,這部分是否有人有研究呢? 我試著寫了一下,注意到這樣建立出來的 FloatWindow 實體不同, 使用類似這種 listener 的方式無法達到目的。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.254.16.222 ※ 文章網址: https://www.ptt.cc/bbs/AndroidDev/M.1447175231.A.AAC.html
givemepass: 第一個bindService可以利用Binder雙向溝通 11/11 13:44
givemepass: 第二個AIDL你也可以實做看看 蠻簡單的 11/11 13:44
charlesdc: 不同app的process可以設定成相同的,也可以相互分享資 11/11 21:13
charlesdc: 料 11/11 21:13
toosakarin: AIDL可以做到跨process callback沒問題 11/13 00:51