Android 应用返回上一个活动而不是下一个活动

Posted

技术标签:

【中文标题】Android 应用返回上一个活动而不是下一个活动【英文标题】:Android app goes back to the previous activity instead of the next activity 【发布时间】:2021-07-20 20:21:57 【问题描述】:

目前我的应用程序有 4 个活动,一切都很好,直到应用程序进入第 3 个活动。而不是去下一个活动,即第四个活动。它从第三个活动回到第二个活动。

我还尝试在主活动中添加一个按钮,该按钮将我直接带到第四个活动,当我单击该按钮时,应用程序就崩溃了。

在第三个活动中,我有一个倒计时计时器,我希望应用程序在计时器完成后转到下一个活动。所以在 OnFinish 函数中的代码是:

override fun onFinish() 
                finish()
                val intent = Intent(this@ThirdActivity, FourthActivity::class.java)
                startActivity(intent)
        

编辑 1: 在 logcat 中,我被重定向到导致错误的代码行。在第四个活动中,我在 onCreate 方法之前声明了一个变量,当我删除该行时,第四个活动运行良好,但我实际上想要声明该变量。

private val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

并且我在 OnCreate 方法之前声明了它,因为我能够在按钮的 setOnClickListener 中调用 vibrator.cancel(),并且如果我声明了变量——在我创建的用于振动设备的函数中的 Vibrator,那么我得到一个未解决的我在 setOnClickListener 中调用 vibrator.cancel() 的参考错误

在振动函数中声明变量“振动器”后出现未解决的引用错误的代码:

btnFinish.setOnClickListener
        finish()
        vibrator.cancel()
    

编辑 2:

我以某种方式让应用程序运行,一切都运行良好。

振动功能:

private fun vibrate(context: Context)
    val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) 
        vibrator.vibrate(VibrationEffect.createWaveform(pattern,-1))
    
    else
        vibrator.vibrate(500)
    

我在 onCreate 中调用了它:

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_finish)

    vibrate(this@FinishActivity)

我还不得不在 onDestroy 方法 XD 中再次声明变量,然后停止振动

override fun onDestroy() 
    val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    super.onDestroy()
    vibrator.cancel()

【问题讨论】:

“当我点击按钮时,应用程序就崩溃了”。然后,您应该将崩溃中的堆栈跟踪添加到您的问题中,并指出堆栈跟踪所引用的代码中的任何位置。 你好。我更新了我的问题 您的问题仍然缺少一些重要信息,例如您拨打setOnClickListener 的确切位置。我不明白你为什么不能将val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as VibratorsetOnClickLister 调用都放在onCreate 中。 我确实尝试过。振动器变量也用于该活动的函数中,如果我在 onCreate 中声明该变量,则该活动的函数中使用的振动器变量会给出未解决的参考错误。 所以有多个本地 vibrator 变量。或者将 vibrator 设为可空或 lateinit 成员变量,在 onCreate 中初始化。 【参考方案1】:
private val vibrator = getSystemService(Context.VIBRATOR_SERVICE) as Vibrator

这是失败的,因为它实际上是对context.getSystemService 的调用,而您的Activity 在第一次构造时没有context,因此以这种方式初始化变量将会失败(您可能遇到的错误告诉过你)。

您可以采用三种主要方法 - 前两种方法是在您确实拥有所需的东西(在本例中为 context)时初始化 vibrator,例如在onCreate

private var vibrator1: Vibrator? = null
private lateinit var vibrator2: Vibrator
private val vibrator3: Vibrator by lazy 
    getSystemService(Context.VIBRATOR_SERVICE) as Vibrator


fun onCreate() 
    vibrator1 =  getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    vibrator2 =  getSystemService(Context.VIBRATOR_SERVICE) as Vibrator
    // vibrator3 will assign itself when you first access it

所以对于前两个,你需要设置它们。

第一个,将其初始化为 null 只是因为在声明它时需要将其设置为 something,这很简单 - 但现在 vibrator 可以为空,您需要对其进行空检查无处不在,而且它实际上不应该为空,您正在使用可空性作为一种解决方法,这使事情变得过于复杂。

第二个,lateinit,是一个承诺,你会在任何尝试读取它之前为其设置一个值。所以你不需要给它一个初始值,你只需要小心你足够早地分配它。不过,它现在必须是 var 而不是 val

第三个,使用lazy,基本上是在第一次访问它时初始化该值。这有点像lateinit,它通过在 lambda 中运行代码来分配自己。这是val!您需要担心的是,第一次访问发生在 lambda 可以成功运行时 - 在这种情况下,您需要 context。但是在 Activity 获得其上下文之前,没有任何东西可以访问 vibrator,所以一切都很好

这些都有优点和缺点,但最好了解它们。尤其是lateinit,这是 Kotlin 让其可空性/空值检查系统干净地工作于无法立即初始化的事情的方式,这在 android 的生命周期回调中经常发生

【讨论】:

哇哦。谢谢你的详细回答。我学到了很多。我测试了您的代码,一切正常,只是它要求我将 val vibrator1 更改为 var。你能再检查一下我的问题吗?我更新了它。实际上,我也找到了一个修复方法,我只声明了两次 vibrator 变量。我知道这可能会在未来带来一些问题,但确实如此。 哦,抱歉,这是个错误,vibrator1 绝对需要是 var(重新分配它才是重点!)。而且您实际上并没有两次声明同一个变量,您只是获得了对系统Vibrator 服务的两个单独引用。无论哪种方式都可以,只执行一次(使用成员变量,而不是每次调用函数时都获取它)效率更高,但它是否重要取决于您调用该函数的频率。当您调用 getSystemService 时,您只需要确保该活动具有隐含的 context - 当 onCreate 发生时,它已经得到了它【参考方案2】:

您正在调用 finish() 方法,这会调用 onDestroy() 生命周期方法,检查该部分是否有可能导致您的问题的代码。或者,如果可能,请尝试删除对 finish() 的调用,看看会发生什么。

【讨论】:

以上是关于Android 应用返回上一个活动而不是下一个活动的主要内容,如果未能解决你的问题,请参考以下文章

Android:返回上一个活动

Android:日常学习笔记——探究活动

关闭应用程序并在 Android 上启动主屏幕

Android - 活动行为?

android插入活动堆栈

Android,检查是不是按下了返回按钮