基于基本活动条件的Android阻止活动?

时间:2016-06-07 04:30:23

标签: android activity-lifecycle

例如.. Activity A尝试启动Activity B,但Activity B要求某些状态在允许显示之前存在(即用户必须首先在另一个实体中创建某个实体)活动,或必须有一个有效的订阅等)。

我有一个BaseActivity我的所有活动都延伸了,我想展示描述限制的AlertDialog并立即在BaseActivity#onCreate方法中完成活动,但是我收到窗口泄漏的错误,因为活动上下文不再存在(因为调用了finish()),并且传递应用程序上下文会引发不同的错误。我无法将finish()调用放入onDismiss因为此后活动仍将加载到模式后面,因为Android模式不会阻止。我还试图覆盖startActivity并且完全禁止活动显示,但这似乎比将条件放在任何地方更糟糕,因为有很多方法可以开始活动,还有一些startActivityX方法必须被覆盖以实现这一目标。

对此有一般的好方法吗?我似乎无法在其上找到任何文档,但是我是否可以实现某种应用程序级别的全局挂钩来运行这些检查并执行这些操作?

1 个答案:

答案 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
        }
    }
}