- 主题:Android里Activity调用Service为什么要用ServiceConnection和Bi
看不懂.
绕来要去, Activity最终通过ServiceConnection获得一个Service实例的引用(Binder持有)
为什么不直接实例化Service得到其引用?
而且代码里还循环依赖, Service持有Binder的引用, Binder又持有Service的引用.
//----------------------Service代码------------------------------
public class MyService extends Service {
private static final String TAG = "zjy";
// 第4步,实例化一个MyBinder对象
private MyBinder mBinder = new MyBinder(this);
@Nullable
@Override
public IBinder onBind(Intent intent) {
return mBinder;//第4步,返回这个mBinder对象
}
//-------------------Binder代码-------------------------------
public class MyBinder extends Binder {
private static final String TAG = "zjy";
private MyService mService;
private OnTestListener mListener;
public MyBinder(MyService service) {
this.mService = service;
}
--
FROM 58.101.35.*
binder的设计主要包含几块:
1. 跨进程调用,service可以和activity在不同的进程里
2. 独立生命周期,activity和service可能生命周期不同
3. 解耦,activity不直接引用service
你如果特别想直接用并且确保统一进程,在service里写个singleton让人去调也不是不行
【 在 Elric 的大作中提到: 】
: 看不懂.
: 绕来要去, Activity最终通过ServiceConnection获得一个Service实例的引用(Binder持有)
: 为什么不直接实例化Service得到其引用?
: ...................
--
FROM 120.244.14.255
感谢
不过第3点, 看到的例子都是耦合的. MyActivity里有MyService.class
【 在 PaoloMaldini 的大作中提到: 】
: binder的设计主要包含几块:
: 1. 跨进程调用,service可以和activity在不同的进程里
: 2. 独立生命周期,activity和service可能生命周期不同
: ...................
--
FROM 58.101.35.*
因为一般例子不写那么复杂吧
如果看系统源代码的话,比如日常用的那一堆getSystemService,
其实全都是通过IBinder接口实现的。
随便举个例子:
TelephonyManager#getDeviceId方法,里面其实是调用了一个叫ITelephony的接口
【 在 Elric 的大作中提到: 】
: 感谢
: 不过第3点, 看到的例子都是耦合的. MyActivity里有MyService.class
--
FROM 120.244.14.255