2011-06-15 110 views
2

我想知道什麼是做到這一點的最好辦法:我查詢到需要記錄用戶的API檢查用戶登錄和啓動LoginActivity

。當應用程序開始進行登錄時,如果它正確,將存儲用戶/傳入首選項。

一旦我們記錄了,如果在我試圖從API調用方法的任何活動中發生NOT_LOGGED錯誤,我將從首選項中檢索用戶/密碼並再次執行登錄。 如果成功,我的程序將再次嘗試API查詢。如果不是,則會打開LoginActivity。這就是我不知道最好做什麼的地方。

作爲「Relogin」的使用方法,我已決定在MyApp中實現,這是一個從Application延伸並保持對象在Activityitiy的所有生命週期中一直存在的類。但是我無法從那裏關閉一堆活動,對嗎? 我的想法是關閉的活動當前堆棧並打開登錄一個,使用此:

if(!mMyApp.relogin(mCtx)){ 
    Intent intent=new Intent(mCtx,ActivityLogin.class);  
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);      
    startActivity(intent); 
    finish(); 
} 

但我不得不打電話從適當的活動方法完成,但沒有從MyApp的。 所以我必須重複所有我使用relogin(mCtx)方法的每個類中的所有代碼。

您是否認爲我以正確的方式解決問題,還是應該改變策略?順便說一下,您認爲最好的地方是實施將從不同活動中調用的方法。到目前爲止,我一直在使用單身人士,但如果gc清理內存,我可能會失去這些信息。

謝謝, David。

回答

2

如果您讓relogin接受Activity實例(而不是通用上下文),則可以在其中調用finish方法。嘗試一下,看看:它應該工作。

而在任何情況下,當你使用Intent.FLAG_ACTIVITY_CLEAR_TOP它會自動銷燬所有活動,所以finish可能是多餘的。

+0

你對通用上下文有什麼意思? mCtx是Activity的成員,因此如果我沒有錯,就是一個活動實例。 – Dayerman 2011-06-15 15:28:04

+0

啊,我假設relogin簽名是'relogin(Context mCtx);',不是'relogin(Activity mCtx);'。如果你想調用'finish',它必須是第二個,因爲'finish'是一個特定於Activity的方法,並且在Context中不可用。 – Femi 2011-06-15 15:39:32

+0

從外部使用FLAG_ACTIVTY_CLEAR_TOP調用它不起作用的活動。一個錯誤產生至極說::導致:android.util.AndroidRuntimeException:從活動上下文外調用startActivity()需要FLAG_ACTIVITY_NEW_TASK標誌。這真的是你想要的嗎? – Dayerman 2011-06-15 16:16:24