[問題] Service 與呼叫者的互動

作者: darkk6 (Mr. Pan)   2015-11-11 01:07:08
大家好,我的問題是 某程式( 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 的方式無法達到目的。
作者: givemepass (λ)   2015-11-11 13:30:00
http://www.slideshare.net/rickwu12/ss-54297655第一個bindService可以利用Binder雙向溝通第二個AIDL你也可以實做看看 蠻簡單的
作者: charlesdc (MoOn)   2015-11-11 21:13:00
不同app的process可以設定成相同的,也可以相互分享資料
作者: toosakarin (~*嵐*~)   2015-11-13 00:51:00
AIDL可以做到跨process callback沒問題

Links booklink

Contact Us: admin [ a t ] ucptt.com