我的问题是...... 如果我们尝试在startActivity()之后执行一些代码,我们会在调用当前Activity的onPause()之前完全执行吗?也就是说,我不是知道当包含它的方法到达终点时(实际上是finish()
方法发生的事情),实际上是否会调用startActivity()。
我有一个例子,我希望在基于某些条件启动新Activity之后detach()
一个对象(具有数据库连接),但我需要此对象来评估一个条件。我知道我可以检查那个条件并将布尔值和detach()
存储在第一个if
之前,但我想知道以下代码是否“合法”。
谢谢!
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
School selectedSchool = new School((Cursor)l.getItemAtPosition(position));
mSharedPreferences.edit()
.putLong(DatabaseManager.SCHOOL_ID, selectedSchool.getIdOpenErp())
.commit();
School.SchoolManager schoolManager = new School.SchoolManager(this);
Long[] sessionIdsOpenErpOfSelectedSchool = schoolManager.getSessionIdsOpenErp(selectedSchool);
if (sessionIdsOpenErpOfSelectedSchool.length > 0) {
if (schoolManager.isPreviousWorkingSchoolPresent()) { // line 10
Intent iParticipationManagement = new Intent(this, ParticipationManagement.class);
startActivity(iParticipationManagement);
} else {
Intent iSelectExistingSession = new Intent(this, SelectExistingSession.class);
startActivity(iSelectExistingSession);
}
} else {
Intent iSelectNewSession = new Intent(this, SelectNewSession.class);
startActivity(iSelectNewSession);
}
// The following line will be executed after one of the startActivity() methods is called...
// Is this legal? Or should I get the value from isPreviousWorkingSchoolPresent() (at line 10)
// before the first if and do the detach() there as well?
schoolManager.detach();
}
答案 0 :(得分:4)
如果您想要在调用startActivity()
的方法中执行任何操作,则会在接到onPause()
的电话之前执行。问题是,您的应用程序默认使用一个主线程,调用onPause()
并在其上发生其他生命周期方法。因此,虽然这个线程忙于在您的方法中执行代码,但它无法处理任何其他内容。
如果您的方法在其他某个线程中执行,那么这只会是一个问题。但是,情况并非如此,因为此方法用于侦听UI事件,因此我假设它始终从主线程调用。
答案 1 :(得分:2)
快速查看Android源代码表明,如果您的代码在主事件线程上执行(在您的情况下看起来是真的),那么它将在调用onPause()之前完成执行。
但是,我建议不要执行可能需要花费超过几毫秒才能完成的代码,因为这可能会影响应用程序在转换到下一个活动时的响应能力。
答案 2 :(得分:0)
主要事件循环,即UI线程处理不仅触摸事件而且还处理活动生命周期回调,当新活动启动时,活动生命周期回调onCreate(),onStart(),onResume ()被添加到事件队列中等待轮到他们也将触摸事件添加到同一个事件队列中,所有代码都在单个主线程中执行。
了解当我们在代码中调用startActivity()时,活动回调onCreate(),onStart(),onResume()或者推入主事件队列,直到执行队列中的先前方法,因此下一个活动不会立即启动,而是将活动回调放入仅在执行当前方法后执行的队列,即startActivity()之后的代码以及下一个活动加载时的代码当前活动的onPause()被推入队列。
如果你看一下活动的生命周期 加载另一个活动时会调用image link onPause