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 Vibrator
和setOnClickLister
调用都放在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 应用返回上一个活动而不是下一个活动的主要内容,如果未能解决你的问题,请参考以下文章