例如.. Activity A
尝试启动Activity B
,但Activity B
要求某些状态在允许显示之前存在(即用户必须首先在另一个实体中创建某个实体)活动,或必须有一个有效的订阅等)。
我有一个BaseActivity
我的所有活动都延伸了,我想展示描述限制的AlertDialog
并立即在BaseActivity#onCreate
方法中完成活动,但是我收到窗口泄漏的错误,因为活动上下文不再存在(因为调用了finish()),并且传递应用程序上下文会引发不同的错误。我无法将finish()
调用放入onDismiss
因为此后活动仍将加载到模式后面,因为Android模式不会阻止。我还试图覆盖startActivity
并且完全禁止活动显示,但这似乎比将条件放在任何地方更糟糕,因为有很多方法可以开始活动,还有一些startActivityX
方法必须被覆盖以实现这一目标。
对此有一般的好方法吗?我似乎无法在其上找到任何文档,但是我是否可以实现某种应用程序级别的全局挂钩来运行这些检查并执行这些操作?
答案 0 :(得分:0)
我最后通过Activity
跟踪Application
课程中当前“有效”ActivityLifecycleCallbacks
,仅在Activity
方法中设置了当前onActivityResumed
并在BaseActivity#onCreate
执行我需要的检查,在无效时调用finish()
并使用我AlertDialog
Activity
显示Application
希望这对某人有帮助,这里有一些代码(Kotlin):
// YourApplication.kt
class YourApplication : Application() {
override fun onCreate() {
...
registerActivityLifecycleCallbacks(object: ActivityLifecycleCallbacks {
...
override fun onActivityResumed(activity: Activity?) {
currentActivity = activity
}
})
}
companion object {
var currentActivity: Activity? = null
private set
}
}
// BaseActivity.kt
open class BaseActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (requiresActiveSubscription() && !SubscriptionService.hasActiveSubscription()) {
finish()
// show alert here using YourApplication.currentActivity as Context
}
}
}