2011-03-31 45 views
1

我正試圖編寫一個具有兩個主要活動的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)循環,但是這只是掛起程序。我想過把它放在一個單獨的線程中,但我不知道如何檢測是否已經有另一個活動正在運行,因此一個單獨的線程將保持循環並打開新的活動(我認爲,我沒有嘗試過它)

任何關於如何解決這個問題的建議?

謝謝。

回答

2

您無法通過在onCreate中循環來執行此操作,因爲在onCreate返回之前,活動實際上並沒有實現。

一種可能性是使用startActivityForResult並安排登錄和顯示活動以返回指示是否退出或繼續進行其他活動的代碼。然後,您可以將您的邏輯放在onActivityResult中,而不是在onCreate中循環。

另一個也許更簡潔的方法是設計Display活動,以便在用戶註銷時直接啓動登錄活動,反之亦然。這樣,主活動可以在確定最初要顯示的活動之後調用finish()

1

我有點困惑你的問題,但我想你想用startActivityForResult而不是startActivity。這將允許您返回登錄Activitytrue/false結果,以便您可以在登錄成功後啓動您的DisplayActivity。同樣,對於您的Display活動,如果用戶註銷,您將finish()Activity並返回一個「註銷」結果到Main,將用戶註銷。

2

關閉我的頭頂。

編寫一個登錄類,爲登錄添加時間戳並在設置的時間間隔後使用方法isLoginStillValid()過期登錄,並將登錄對象保存在onRetainNonConfigurationState的軟件殺手中。在onCreate中檢索登錄對象。保存登錄字段,如果適用於onDestroy()中的首選項。在onRetainNonConfigurationState中設置一個標誌isSavedInstanceState爲true,並使用它來確定是否需要寫入onDestroy中的首選項。我知道這聽起來很複雜,但這是一個可重用的模板。

最後,在onCreate中,查找登錄對象。檢查是否登錄已過期。如果是這樣,發佈一個GetLogin對話框。在每個有資格的呼叫中,檢查登錄是否已過期,然後才允許訪問已認證的呼叫。如果登錄已過期,請考慮再次發佈GetLogin對話框。請記住,自應用程序進入前臺以來,時間可能已過去。

最後,使用startActivityForResult啓動GetLoginDialog,以便您可以檢索登錄數據並使用新的時間戳更新登錄對象。

JAL