作者darkk6 (Mr. Pan)
看板AndroidDev
标题[问题] Service 与呼叫者的互动
时间Wed Nov 11 01:07:08 2015
大家好,我的问题是 某程式( 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://webptt.com/cn.aspx?n=bbs/AndroidDev/M.1447175231.A.AAC.html
2F:推 givemepass: 第一个bindService可以利用Binder双向沟通 11/11 13:44
3F:→ givemepass: 第二个AIDL你也可以实做看看 蛮简单的 11/11 13:44
4F:推 charlesdc: 不同app的process可以设定成相同的,也可以相互分享资 11/11 21:13
5F:→ charlesdc: 料 11/11 21:13
6F:→ toosakarin: AIDL可以做到跨process callback没问题 11/13 00:51