使用scala trait 自动 绑定service 到 Activity 或其他service

得益于 scala trait 的链式操作

假设你有一个UtilService 内容如下

class UtilService extends Service {
  utilService =>               // UtilService.this 别名 
   
  def doSomething(xx: Any) = {
	//  your code 
  }
			
  def onBind(p1: Intent) = new UtilServiceBinder

  class UtilServiceBinder extends Binder {
    def getService = utilService
  }

}


添加一个 base trait MixinUtilServiceBase

protected trait MixinUtilServiceBase {

  lazy val utilService = {
    assert(utilServiceHolder != null); utilServiceHolder
  }    // utilService 将混入(mixin) 到 activity 或 service
  private var utilServiceHolder: UtilService = null
  protected val utilServiceConnection = new ServiceConnection {
    def onServiceConnected(className: ComponentName, binder: IBinder) {
      utilServiceHolder = binder.asInstanceOf[UtilService#UtilServiceBinder].getService
    }

    def onServiceDisconnected(className: ComponentName) {
	// do something 
    }
  }

}


添加一个trait ActivityMixinUtilService

trait ActivityMixinUtilService extends Activity with MixinUtilServiceBase {
  context =>

  abstract override def onCreate(savedInstanceState: Bundle) {
    super.onCreate(savedInstanceState)
    bindService(new Intent(context, classOf[UtilService]), utilServiceConnection, Context.BIND_AUTO_CREATE)
  }

  abstract override def onDestroy() {
    unbindService(utilServiceConnection)
    super.onDestroy()
  }
}



现在你可以在你自己的Activity 内使用 ActivityMixinUtilService trait 了, 想下面这样

class Main extends Activity with ActivityMixinUtilService {
  context =>
  
  def doSome() {
    utilService.doSomething() // 现在 utilService 混合(mixin) 到了main Activity  
  }
}


extends Activity 可以省略掉

class Main extends ActivityMixinUtilService 


像Activity一样 ServiceMixinUtilService

trait ServiceMixinUtilService extends Service with MixinUtilServiceBase {
  context =>

  abstract override def onCreate() {
    super.onCreate()
    bindService(new Intent(context, classOf[UtilService]), utilServiceConnection, Context.BIND_AUTO_CREATE)
  }

  abstract override def onDestroy() {
    unbindService(utilServiceConnection)
    super.onDestroy()
  }
}



确保添加UtilService 到AndroidManifest.xml

<service android:name=".services.UtilService"/>

posted @ 2011-12-03 22:20  夜精灵  阅读(464)  评论(7)    收藏  举报