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