Last active
January 5, 2020 14:48
-
-
Save Miha-x64/e792377d5a408442226923da9085f4b1 to your computer and use it in GitHub Desktop.
Boilerplate for bound services (may become a part of http://github.com/Miha-x64/Flawless) later
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package net.aquadc.flawless.service | |
import android.app.Service | |
import android.content.Context | |
import android.content.Intent | |
import android.content.ServiceConnection | |
import android.os.Binder | |
import android.os.IBinder | |
/** | |
* An Android service which provides a plain, Android-independent service. | |
* https://gist.github.com/Miha-x64/e792377d5a408442226923da9085f4b1 | |
*/ | |
abstract class BoundService<T> : Service() { | |
/** | |
* Actual service which should be returned to Activity. | |
*/ | |
protected abstract val actual: T | |
/** | |
* A binder which will expose our [actual] service, when invoked as a function. | |
*/ | |
private val binder = object : Binder(), () -> Any? { | |
override fun invoke(): Any? = actual | |
} | |
final override fun onBind(intent: Intent?): IBinder? = | |
binder | |
} | |
/** | |
* Reified shortcut for [Context.bindService] with an empty [Intent] and [Context.BIND_AUTO_CREATE] flag. | |
*/ | |
inline fun <reified T : BoundService<*>> Context.bindService(connection: ServiceConnection) { | |
check(bindService(Intent(this, T::class.java), connection, Context.BIND_AUTO_CREATE)) | |
} | |
/** | |
* @return actual service provided by a [BoundService] instance | |
*/ | |
@Suppress("UNCHECKED_CAST") // I don't mind, really | |
fun <T> IBinder.getActual(): T = | |
(this as () -> Any?)() as T |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class SomeServiceHost : BoundService<SomeService>() { | |
override val actual = SomeService() | |
// and do whatever you need | |
} | |
class SomeUi : Activity or Fragment, ServiceConnection { | |
override fun onStart() { | |
super.onStart() | |
bindService<SomeServiceHost>(this) | |
} | |
override fun onStop() { | |
unbindService(this) | |
super.onStop() | |
} | |
override fun onServiceConnected(name: ComponentName, service: IBinder) { | |
service.getActual<SomeService>().doWhateverYouNeed() | |
} | |
override fun onServiceDisconnected(name: ComponentName) { | |
doCleanUp() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment