2011-05-25 106 views
0

我的Android應用程序有一個不活動超時。超時時,我將用戶返回到「登錄」屏幕,該屏幕始終位於後退堆棧中。我的SignIn類設置了android:launchMode="singleTop",因此在堆棧中運行的實例總是被重用。保持應用程序在後臺響應意圖

我開始對超時此意圖:

Intent inactivityTimeout = new Intent(this, SignIn.class); 
inactivityTimeout.putExtra(INTENT_EXTRA_INACTIVITY_TIMEOUT, true); 
int flags = inactivityTimeout.getFlags(); 
flags = flags|FLAG_FROM_BACKGROUND|Intent.FLAG_ACTIVITY_CLEAR_TOP; 
inactivityTimeout.setFlags(flags); 

當簽到屏幕啓動時,它會檢查INTENT_EXTRA_INACTIVITY_TIMEOUT意向額外費用。如果找到,它會顯示「您已被註銷」對話框。這一切都正常工作。現在

我去拿的問題:由於它是基於一個計時器,這種意圖可以不管,如果我的應用是在前景或背景發射了。這是所希望的,因爲我不希望應用程序因爲它在後臺而無限期地保持登錄狀態。

但是,當應用程序在後臺並且計時器到期時,將關閉此inactivityTimeout Intent並將應用程序帶回到前臺。現在並不急於提醒用戶現在他們已超時,所以我寧願應用停留在後臺以便不中斷當前操作。

我嘗試添加了FLAG_FROM_BACKGROUND標誌,我的意圖,但應用程序仍帶到前臺。我不確定還有什麼要嘗試的,或者如果這是我應該在我的意圖或我的接收活動中處理的問題。

任何人都可以提出一個方法在我的意圖來實現這一點(或響應活動?)。或者我在這裏錯過了一些概念?謝謝!

回答

5

沒有必要主動撤銷,由於年齡的憑據。畢竟,在用戶嘗試重用這些憑證之前,該過程可能會終止。

每個活動都需要進行檢查,看用戶是否有有效憑證。在該檢查中,您還要檢查年齡,如果證書正確但太舊,則僅憑證書檢查失敗。而且,在失敗的憑證檢查中,您將顯示您的登錄活動。

這允許您轉儲計時器。

+0

+1更簡單(也更符合邏輯)解決方案 – Aleadam 2011-05-25 18:24:07

+0

感謝Mark!這非常有幫助。然而,我愚蠢地忽略了至少一些細節:首先,非活動超時是本地的,並在用戶執行任何操作時重置(我使用onUserInteraction())。其次,當應用程序處於前臺時發生超時時,我希望Intent在沒有任何其他用戶交互的情況下觸發。這就是計時器派上用場的地方(我在活動改變時重置它,並在onUserInteraction() - 如果它運行到0它將啓動意圖)。 – Jordan 2011-05-25 19:14:19

+0

無論如何,正如你所建議的,我可以更新憑證的值(如'timeOfLastAction')來跟蹤最近的用戶操作。不過,我必須定期檢查這些憑據是否有效(即不足以觸發超時),並顯示對話框,如果它們自上次檢查以來已變得無效。爲了實現這個功能,我必須保留計時器,對吧? – Jordan 2011-05-25 19:14:48

2

你可以有一個全局靜態變量來檢查應用程序在前臺:

public static boolean isForeground = false; 

在每一個活動的onPause設置變量假 在每個活動的onResume設置變量真正

這樣你知道該應用程序是否在前臺。

當達到超時,如果該活動是在前臺,火的意圖。 如果不是,請設置全局靜態變量true。這個變量將在每個onResume上進行檢查,如果它的值爲true,它將觸發超時意圖(這種方式會在您恢復應用程序時觸發)。

public static boolean hasTimeout = false; 

如果您有一個BaseActivity實現此功能,那麼可以通過所有其他活動擴展此功能。

+1

當您的答案出現時,我即將發佈的內容幾乎相同。唯一的區別是我在SharedPreferences中考慮一個標誌而不是靜態字段。 – Aleadam 2011-05-25 18:22:38

相關問題