Useful to develop a standalone library
//from anywhere val application = ApplicationProvider.application//from anywhere val currentActivity : Activity? = ActivityProvider.currentActivity()Or safety from a kotlin coroutine context :
launch { val currentActivity = ActivityProvider.activity() //cannot be null Log.d(TAG, "activity : $currentActivity") }launch { ActivityProvider.listenCurrentActivity().collect { Log.d(TAG, "activity : $currentActivity") } }If you need to execute a code automatically when the application starts, without adding it into your application's class code
Create a class that extends Provider
class StethoProvider : Provider() { override fun provide() { val application = ApplicationProvider.application //if you need the application context Stetho.initializeWithDefaults(application) } }Add it into your manifest
<provider android:name=".StethoProvider" android:authorities="${applicationId}.StethoInitializer" />dependencies { implementation 'com.github.florent37:applicationprovider:(lastest version)' }You do not need to override the Application now
class MyApplication : Application() { override fun onCreate(){ Stetho.initializeWithDefaults(application) } }Note that you can include it directly on your library's aar
class StethoInitializer : ProviderInitializer() { override fun initialize(): (Application) -> Unit = { Stetho.initializeWithDefaults(application) } }<provider android:name=".timber.TimberInitializer" android:authorities="${applicationId}.StethoInitializer" />Another way using Initializer
val InitializeStetho by lazy { ApplicationProvider.listen { application -> Stetho.initializeWithDefaults(application) } } class MainActivity : AppCompatActivity() { init { InitializeStetho } override fun onCreate(savedInstanceState: Bundle?) { ... } }