2011-04-29 124 views
4

我試圖在Android上爲我的應用程序實現一些自動註銷代碼。Android檢測應用程序是否進入後臺

我需要檢測屬於應用程序的所有活動是否已進入後臺,而不是針對每個單獨的活動使用onPause()onResume()。 iOS有一個我可以利用的有幫助的applicationDidEnterBackground:方法,但我無法在Android的Application類中找到類似的功能。

一種方法似乎是有一個AtomicInteger計數器,並在活動變爲可見時遞增計數,並在計數結束或onStop()被調用時遞減計數。所以如果計數器變爲零,我可以啓動一個在後臺運行的服務並處理註銷。這是通常做到的嗎?

回答

14

當用戶切換到另一個選項卡或最小化其瀏覽器窗口時,您確實不希望在「應用程序」在後臺進行註銷時退出用戶,而不是退出Web應用程序的用戶片刻。如果您要在Web應用程序中執行這些任何一項操作,那麼您的用戶會認爲您的Web應用程序是史詩般的失敗。同樣,如果用戶撥打了錯誤號碼的電話,或者鬧鐘響了,他們會很生氣,如果他們必須馬上回去登錄,並且在他們剛剛使用您的應用程序時登錄5秒鐘。在這裏,通過「惱火」,我指的是市場上的一星評級和討厭的評論。

Web應用程序自動註銷基於不活動,使用服務器會話cookie。

同樣,當我建立一個安全的Android應用程序,我將實現一個基於活動的機制,或許是這樣的:

第1步:用一個靜態的單一實例創建Session類。 Session對象保存上次訪問的時間戳。

步驟2:在每個活動的onResume()中,查看Session單身是否存在。如果不是,這是一個全新的過程,所以如果這不是身份驗證活動,請立即執行startActivity()以啓動身份驗證活動。

步驟3:返回每個活動的onResume(),如果存在Session對象,請撥打extend()之類的東西。這將返回一個boolean,true表明會話仍然良好(並且時間戳已經更新到現在),否則返回false。如果返回false,請執行與Session對象爲null相同的操作。

步驟#4:您的驗證活動成功後,使用當前時間戳設置單身人士Session對象。

步驟#5:您的Session分類'extend()方法是您確定會話是否過舊的地方。

無論用戶如何進入應用程序,如果會話太舊(或者它是一個全新的進程),它們都會被強制進行身份驗證。但是,如果用戶暫時中斷 - 您和/或用戶可以在其中簡要定義 - 他們不必重新進行身份驗證。

+0

哎呀,這就是我的意思,我想在分鐘後自動註銷,而不是每次應用程序進入後臺時註銷。對於類似的問題,其中一個建議是在後臺運行一項服務,並將BroadCast發送給我的所有實施廣播接收器的活動,但這是一個更好的方法。 – 2011-04-30 19:52:38

+0

@Tejaswi Yerukalapudi:是的,服務和接收方法會相當重量級。 – CommonsWare 2011-04-30 22:02:17

+2

某些應用程序在進入後臺時會退出,例如銀行應用程序。只是我的意見... – 2012-04-04 09:28:44

18

對此沒有全局回調,但對於每個活動它都是onStop()。你不需要混淆原子int。只需要一個全局的int,其中包含啓動活動的數量,每個活動都會在onStart()中增加它,並在onStop()中將其遞減。

+4

這個偉大的工程的共享PREF上onCreat。如果您的所有活動都具有基類,那麼很容易檢測應用程序何時移至前臺(計數從0增加到1)以及何時移動到後臺(計數達到0)。 – 2012-07-31 14:41:30

+0

這個答案更符合帖子的標題。如果您有興趣檢測應用程序是否進入後臺,請考慮這一點。這對我來說很有用。 – 2012-10-31 13:24:02

+0

如果'API> 14''registerActivityLifecycleCallbacks'方法可用於計數器遞增/遞減 – 2013-07-30 13:47:12

1

我認爲你的建議可能是最好的方法。不幸的是,我不認爲有API調用來檢測你的應用程序是否在後臺。你只需要操作onPause()和onResume()方法。請記住,您需要考慮活動之間的轉換,因此一旦您的AtomicInteger達到0,我會等待很短的時間,並重新檢查它仍然爲0,以確保它不僅僅是轉換活動。

0

創建應用程序類和包括在清單

<application 
     android:name="com.example.hello.MyApplication" 



public class MyApplication extends Application implements 
     ActivityLifecycleCallbacks, ComponentCallbacks2 

重寫以下方法

@Override 
public void onTrimMemory(int level) { 
     // this method is called when the app goes in background. 
     // you can perform your logout service here 
     super.onTrimMemory(level); 
    } 

這是有效的API級14及以上。

你甚至可以根據應用程序在後臺的時間來執行註銷,我建議這是一個更好的選擇。這裏是你可以做什麼來創造的「會話超時」

  1. 保存onTrimMemory(int level)方法

  2. 上所有的活動onStrat(裏面SharedPreferences時間戳)從sharedPref得到時間戳和比較它與當前時間。基於此,您可以執行註銷。

  3. ,並清除所有MyApplication

相關問題