Diese Frage ist zwar schon ziemlich alt, aber inzwischen gibt es eine gute Lösung, wenn Sie wollen, dass es mit jedem aktiven Activity
. Sie brauchen sich also nicht einzeln zu registrieren. Activities
wie es in anderen Antworten vorgeschlagen wird.
Ich möchte betonen, dass dies in der Regel etwas ist, das Sie vermeiden sollten - das Erstellen von Dialogen ohne Kenntnis des Ansichtskontextes, aber es kann besondere Umstände geben, unter denen dies nützlich sein kann.
Bei dieser Lösung mit ActivityLifecycleCallbacks
Sie sind sich immer der aktiven Activity
auf Application
Ebene. Diese aktive Ebene können Sie dann verwenden Activity
zum Öffnen von Dialogen oder anderen Activities
von z. B. Netzwerkcode, bei dem Sie nur Zugriff auf die Application
Klasse:
class YourApplication : Application() {
private val activeActivityCallbacks = ActiveActivityLifecycleCallbacks()
override fun onCreate() {
super.onCreate()
registerActivityLifecycleCallbacks(activeActivityCallbacks)
}
override fun onTerminate() {
unregisterActivityLifecycleCallbacks(activeActivityCallbacks)
super.onTerminate()
}
fun getActiveActivity(): Activity? = activeActivityCallbacks.getActiveActivity()
// ...
}
class ActiveActivityLifecycleCallbacks : Application.ActivityLifecycleCallbacks {
private var activeActivity: Activity? = null
fun getActiveActivity(): Activity? = activeActivity
override fun onActivityCreated(activity: Activity, savedInstanceState: Bundle?) {
activeActivity = activity
}
override fun onActivityDestroyed(activity: Activity) {
if (activity === activeActivity) {
activeActivity = null
}
}
// ...
}
Von überall her:
YourApplication.get().getActiveActivity()?.let { activity ->
activity.runOnUiThread {
AlertDialog.Builder(activity).setMessage("test").show()
}
}
Bitte schauen Sie in anderen SO-Beiträgen nach, wie man einen Getter für die Application
: z.B. Kotlin Singleton-Anwendungsklasse