2012-01-09 46 views
2

當主要活動加載時,可以通過更新遠程數據庫行將已記錄的用戶狀態設置爲聯機。如果用戶退出應用程序,則必須將用戶狀態設置爲離線。從堆棧中刪除的主要活動 - 將uset狀態設置爲脫機

如果應用程序退出使用後退按鈕我有onDestroy()方法,並在那裏我可以設置用戶狀態爲離線,但如果我退出使用主頁按鈕,我殺了應用程序的設置onDistroy()isn'叫。

有沒有辦法知道什麼時候主要活動不再是棧,這樣我就可以更新用戶的狀態?

+0

此主題可能對您有所幫助。 AFAIK達爾維克將負責在需要時關閉您的應用程序。這裏是關於這個討論的鏈接。 http://stackoverflow.com/questions/5279292/application-close-event-in-android – kosa 2012-01-09 14:49:37

回答

1

整理主頁按鈕不叫onDestroy爲該活動仍然在活動堆棧中,與後退按鈕一樣,它通常會被刪除。當ActivityManager決定從堆棧中刪除活動時,通常在一段時間不活動或需要資源時,onDestory將在您的字段將被重置的時間點被調用。

我無法明確地說,因爲我不知道所有的信息,但是當您按回家時(在coder_For_Life22建議的onStart中),似乎刪除用戶登錄狀態可能會很糟糕,就像您返回到用戶將不得不再次登錄的活動,可能不必要,客戶端會話管理將變得更加複雜。

你的會話管理的方法似乎相當可疑無論如何,除非你有某種形式的服務器端會話管理的地方,例如,如果有對會議活動的數據庫字段將被重置。

UPDATE

我能想到有可能是使用ActivityManager.getRunningTasks()ActivityManager.getRunningAppProcesses()和檢查,如果你的應用是其中的唯一途徑。如果你殺了你的應用程序就像你建議那麼你的應用程序將不會在其中,因此你知道。這似乎是一個非常複雜的解決方案,如果可能的話,你會需要運行一個獨立的後臺服務(你可以呼籲getSystemService(ACTIVITY_SERVICE)得到ActivityManager)只是等你以後殺了你的應用程序,你仍然有一些運行,可以檢查該和執行適當的操作。

殺死你的應用程序這種方式忽略了活動的生命週期,因此沒有在您的活動在這裏你可以進行關閉通話鉤。

看起來更明智的做法是檢查服務器端的非活動狀態並以這種方式重置該字段,人們通常不會像這樣殺死他們的應用程序,當他們這樣做時,他們不可能迅速將手機交給某人否則誰將能夠惡意訪問這些信息。

如果數據需要這樣的安全性,那麼你應該重新考慮你的安全模型。

+0

我想僅在應用程序關閉時才使用戶脫機。當用戶按下主頁按鈕,然後強制關閉應用程序的設置 - 這是我想也使用戶脫機的情況下,我不知道如何得到這個。 – dorin 2012-01-09 14:56:11

2

當用戶單擊後退或home鍵的onStop將被觸發。因此,請在onStop中處理您的事件。

public void onStop() { 
//do your stuff here 
super.onStop() 
} 

編輯:

也可以嘗試

@Override 
protected void onPause() 

super.onPause(); 




} 

你也可以有它檢查應用程序與

if (this.isFinishing()){ 
    //Insert your finishing code here 

} 
+0

但是如果你從主要活動轉到另一個活動(不是主屏幕),也會調用onStop。用戶仍在線。 – dorin 2012-01-09 14:42:23

+0

查看我的編輯 – 2012-01-09 14:47:42

+0

你會從哪裏調用isFinishing()? – zode64 2012-01-09 16:21:55