我正在尝试编写一个有两个主要活动的Android应用程序:登录屏幕和显示屏幕。目前我正在设置它,以便如果用户已经登录,将跳过登录屏幕。
为了找到最好的方法,我创建了一个通用的“Main”活动,看起来像这样:
public class Main extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
// Get preferences
SharedPreferences settings = getSharedPreferences("PREFERENCES", MODE_PRIVATE);
super.onCreate(savedInstanceState);
//setContentView(R.layout.viewusage);
//System.out.println(settings.getBoolean("LOGGEDIN", false));
if (settings.getBoolean("LOGGEDIN", false) == false)
{
Intent intent = new Intent(Main.this, Login.class);
startActivity(intent);
}
else
{
Intent intent = new Intent(Main.this, Display.class);
startActivity(intent);
}
}
}
这个想法是当有人成功登录时,登录活动将保存用户首选项所需的所有详细信息,然后完成()活动。这将返回Main活动。我正在尝试做的是让主要活动在没有任何活动运行的情况下继续循环if ... else语句:所以当登录页面关闭时,它将重新运行if ... else语句,应该启动Display活动而不是Login活动。如果用户从Display类注销,则反之亦然。
我想过使用while(true)循环,但这只是挂起程序。我想过把它放在一个单独的线程中,但我不知道如何检测是否已经有另一个活动正在运行,所以一个单独的线程将继续循环并打开新的活动(我猜想,我没试过它)
关于我如何解决这个问题的任何建议?
感谢。
答案 0 :(得分:2)
你不能通过onCreate
循环来实现,因为在onCreate
返回之前,活动实际上并没有开始。
一种可能性是使用startActivityForResult
并安排登录和显示活动以返回指示是退出还是继续执行其他活动的代码。然后,您将逻辑放在onActivityResult
中,而不是在onCreate
中循环。
另一种可能更简洁的方法是将Display活动设计为在用户注销时直接启动Login活动,反之亦然。这样,主要活动可以在确定最初要显示的活动后调用finish()
。
答案 1 :(得分:2)
脱离我的头顶。
编写一个登录类,用于为登录设置时间戳,并在设定的时间间隔后使用方法isLoginStillValid()使登录失效,并将登录对象保存在onRetainNonConfigurationState中的软杀死中。在onCreate中检索登录对象。保存登录字段(如果适用于onDestroy()中的首选项)。在onRetainNonConfigurationState中将标志isSavedInstanceState设置为true,并使用它来确定是否需要在onDestroy中写入prefs。我知道这听起来很复杂,但这是一个可重复使用的模板。
所以最后,在onCreate中,查找登录对象。检查登录是否已过期。如果是这样,请发布GetLogin对话框。在每个凭证呼叫中,在允许访问凭证呼叫之前,检查登录是否已过期。如果登录已过期,请考虑再次发布GetLogin对话框。请记住,自应用程序到达前台后,时间可能已经过去了。
最后,使用startActivityForResult启动GetLoginDialog,以便您可以检索登录数据并使用新的时间戳更新登录对象。
JAL
答案 2 :(得分:1)
我对你的问题感到有点困惑,但我认为你想使用startActivityForResult
而不是startActivity
。这样,您就可以从登录true
返回false
/ Activity
结果,以便在登录成功后启动Display
Activity
。同样,对于您的Display
活动,如果用户退出,您将finish()
Activity
并将“退出”结果返回到Main
,以便将用户注销。