得益于 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"/>