根据条件循环启动活动

问题描述:

我正试图编写一个具有两个主要活动的Android应用程序:登录屏幕和显示屏幕。目前我正在设置它,以便如果用户已经登录,登录屏幕将被跳过。根据条件循环启动活动

为了制定出要做到这一点的最好办法,我创建了一个通用的“主”的活动,看起来是这样的:

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); 
     } 

    } 

} 

的想法是,当有人成功登录,登录活动将保存用户首选项所需的所有详细信息,然后完成()该活动。这将返回到主要活动。我试图做的是在没有任何活动正在运行时,主要活动保持循环遍历if ... else语句:因此,当登录页面关闭时,它将重新运行if ... else语句,并应启动显示活动而不是登录活动。如果用户从Display类注销,则反之亦然。

我想过使用while(true)循环,但是这只是挂起程序。我想过把它放在一个单独的线程中,但我不知道如何检测是否已经有另一个活动正在运行,因此一个单独的线程将保持循环并打开新的活动(我认为,我没有尝试过它)

任何关于如何解决这个问题的建议?

谢谢。

您无法通过在onCreate中循环来执行此操作,因为在onCreate返回之前,活动实际上并没有实现。

一种可能性是使用startActivityForResult并安排登录和显示活动以返回指示是否退出或继续进行其他活动的代码。然后,您可以将您的逻辑放在onActivityResult中,而不是在onCreate中循环。

另一个也许更简洁的方法是设计Display活动,以便在用户注销时直接启动登录活动,反之亦然。这样,主活动可以在确定最初要显示的活动之后调用finish()

我有点困惑你的问题,但我想你想用startActivityForResult而不是startActivity。这将允许您返回登录Activitytrue/false结果,以便您可以在登录成功后启动您的DisplayActivity。同样,对于您的Display活动,如果用户注销,您将finish()Activity并返回一个“注销”结果到Main,将用户注销。

关闭我的头顶。

编写一个登录类,为登录添加时间戳并在设置的时间间隔后使用方法isLoginStillValid()过期登录,并将登录对象保存在onRetainNonConfigurationState的软件杀手中。在onCreate中检索登录对象。保存登录字段,如果适用于onDestroy()中的首选项。在onRetainNonConfigurationState中设置一个标志isSavedInstanceState为true,并使用它来确定是否需要写入onDestroy中的首选项。我知道这听起来很复杂,但这是一个可重用的模板。

最后,在onCreate中,查找登录对象。检查是否登录已过期。如果是这样,发布一个GetLogin对话框。在每个有资格的呼叫中,检查登录是否已过期,然后才允许访问已认证的呼叫。如果登录已过期,请考虑再次发布GetLogin对话框。请记住,自应用程序进入前台以来,时间可能已过去。

最后,使用startActivityForResult启动GetLoginDialog,以便您可以检索登录数据并使用新的时间戳更新登录对象。

JAL