胡凯

Android Notes(02) - AIDL

| Comments

  • 在Android process之间不能用通常的方式去访问彼此的内存数据。 他们把需要传递的数据解析成基础对象,使得系统能够识别并处理这些对象。因为这个处理过程很难写,所以Android使用AIDL来解决这个问题。
  • 在定义AIDL接口之前,请意识到call这些接口是direct function call。 请不要认为这些call 接口的行为是发生在另外一个线程里面的。具体的不同因这个调用是发生在local process还是remote process而异。
    • 发生在local process里面的调用会跑在这个local process的thread里面。如果这是你的主UI线程,那么AIDL接口的调用也会发生在这个UI thread里面。如果这是发生在另外一个thread,那么调用会发生在service里面。因此,如果仅仅是发生在local process的调用,则你可以完全控制这些调用,当然这样的话,也就不需要用AIDL了。因为你完全可以使用Bound Service的第一种方式去实现。
    • 发生在remote process里面的调用是会跑在你自己的process所维护的一个thread pool里面。那么你需要注意可能会在同一时刻接受到多个请求。所以AIDL的操作需要做到thread-safe。(每次请求,都会交给Service,在线程池里面启动一个thread去执行那些请求,所以那些方法需要是线程安全的)
    • oneway关键字改变了remote call的行为。当使用这个关键字时,remote call不会被阻塞住,它仅仅是发送交互数据后再立即返回。IBinder thread pool 之后会把它当作一个通常的remote call呼叫。

Android Notes(01) - Bound Services

| Comments

  • 一个bound的service是C/S的接口。它允许其他组件绑定到service,发送请求,接收回应并执行IPC。通常是需要给其他程序组件提供服务。
    • A bound service allows other components to bind to it, in order to interact with it and perform interprocess communication。
    • A bound service is destroyed once all clients unbind, unless the service was also started。
  • 客户端通过执行 bindService()绑定到service。这样的话,客户端需要实现一个ServiceConnection, 它可以监视与service的连接状态。bindService() 并不会有返回值,但是Android系统会在client与service连接上时,执行onServiceConnected() 的callback。在这个回调方法里面传递IBinder给client用来与service进行交互。
  • 前面提到可以有多个Client同时bind到service。然而,系统只会在第一个client做绑定时才会执行service的onBind() 方法。对于随后需要绑定的客户端,系统会直接传递同一个 IBinder 对象给Client,而不是去再次执行onBind方法。(那么也就是onBind方法只会被执行一次)
  • 通常来说,Music程序需要实现service的两种方式,这样既可以在activity被销毁之后(假设只实现bound的方式的话,这个时候,unbind了,Music会停止)音乐可以继续播放,当重新进入activity时又会重新bind上。这刚好验证了下面的说法:
  • 如果一个service既可以started与bound。当一个service是started的,系统并不会在所有的Client都unbind之后去杀死这个service,我们需要显示的去停止这个service,通过stopSelf或者stopService的方式。

Android Notes(00) - Services

| Comments

概要

  • Service是一个可以在后台长时间进行工作的一个程序组件。这个组件并没有提供UI。其他的程序组件可以Start一个Service,并且可以在用户切换到另外一个程序的时候继续工作。另外,某个组件可以Bind到一个Service上,并与他进行交互,甚至是进行IPC操作。例如,一个Service可以处理网络交互,播放音乐,执行I/O操作,或者与Content Provider进行交互,他们都是在后台的。
    • Service可以跑在后台进行工作,即使用户在切换到另外一个程序。
    • Service可以允许其他组件与它进行Bind,从而进行IPC操作。
    • Service默认是跑在host程序的main thread。