2012-01-23 150 views
13

我想要檢測我的應用程序何時發送到後臺。關於連接HOME鍵有很多問題 - 我明白這隻有通過註冊爲啓動程序纔有可能。當應用程序轉到後臺時Android自動註銷

......但一如既往還有誰想要某種行爲客戶端...

我們有安全性要求高的應用程序。客戶希望應用程序每當應用程序進入後臺時出於任何原因(電話,HOME鍵,返回上一個活動)退出服務器(* * 以闡明我的意思是當屏幕上的前Activity是不是我的應用程序的活動之一 * *)。

所以,如果我不能掛鉤的HOME鍵,還有什麼其他的選擇?顯然只是鉤onPause()不會幫助,因爲那是Activity特定。

我們提出的「最佳」是在我們的Application類中保留一個Activity引用數組。在每個活動的onResume()中,我們將其添加到此數組中。在onPause()我們刪除它。同樣在onPause()我們通過這個數組來枚舉是否有任何註冊的活動在前臺。如果沒有找到前景活動,用戶將被註銷。

我很不滿意這個解決方案,希望找到更好的方法。

回答

5

我們eneded起來去爲通過@peceps基於解決方案的東西在這裏:Run code when Android app is closed/sent to background

+1

我剛剛給這個線程添加了一條新評論,其中我使用Application.ActivityLifecycleCallbacks以及@peceps方法展示了一個更好的方法(在我看來)。查看我對該主題的回答:http://stackoverflow.com/a/13996042/327386 – RPM

+0

+1 API 14+的絕佳解決方案 –

0

或者您可以使用單身人士的共享對象,並創建將獲取/設置該共享對象上的數據的單個onPause()onResume()。這些功能將用於所有活動'和onResume

0

這應有助於:

這Activity類

protected void onUserLeaveHint() 

    Since: API Level 3 
    Called as part of the activity lifecycle when an activity is about to go into the background as the result of user choice. For example, when the user presses the Home key, onUserLeaveHint() will be called, but when an incoming phone call causes the in-call Activity to be automatically brought to the foreground, onUserLeaveHint() will not be called on the activity being interrupted. In cases when it is invoked, this method is called right before the activity's onPause() callback. 
    This callback and onUserInteraction() are intended to help activities manage status bar notifications intelligently; specifically, for helping activities determine the proper time to cancel a notfication. 
+1

他指出,活動方法不會做,因爲他使用多個活動。如果使用onPause或onUserLeaveHint,則無關緊要。唯一真正的區別是第二個人在比第一個少的情況下被解僱。 – dtech

1

我之前能夠解決同樣的問題,但有沒有辦法做到這一點,因爲我知道,除了現在用自己的方式找到SA方法。捕獲活動顯示狀態的最佳重寫方法是onStart(),onStop()此方法捕獲實際可見性更改並計算您的活動堆棧計數以註銷。

0

我不知道它會幫助你,但我會以這種方式

  1. 嘗試創建基礎Activity並覆蓋其onStop()方法從服務器
  2. 註銷
  3. 所有Activities我的應用程序將擴展到基類之上。

所以,現在如果在任何活動進去的onStop狀態它將從服務器註銷不管活動是如何

注意進入後臺發生了什麼:但是,如果你從你的代碼將停止任何活動,通過調用完成隨後也將註銷,所以你在那種情況下制定出

+0

thx - 我瞭解Android活動的生命週期 - 問題是試圖找出解決應用程序生命週期的方法,Android設計師決定不讓應用程序掛住HOME按鈕。你在筆記中提到的邏輯恰恰是我試圖通過提問來解決的問題。我正在尋找一個優雅的方式來做到這一點。 –

+0

沒有任何問題,在您的BaseActivity中創建一個方法,當您完成活動時將布爾值設置爲true,並根據該值註銷檢查BaseActivity的onStop中的布爾值,反之亦然 – ingsaurabh

6

//使用服務

//在

@Override 
    public void onStart(Intent intent, int startId) { 
     super.onStart(intent, startId); 

     IntentFilter filter = new IntentFilter(); 
    filter.addAction(Intent.ACTION_SCREEN_OFF); 
    filter.addAction(Intent.ACTION_CALL); 
    filter.addAction(Intent.ACTION_ANSWER); 

    registerReceiver(mIntentReceiver, filter); 

}

//然後在廣播接收器

private BroadcastReceiver mIntentReceiver = new BroadcastReceiver() { 
     @Override 
     public void onReceive(Context context, Intent intent) { 
      String action = intent.getAction(); 

      if(action.equalsIgnoreCase("android.intent.category.HOME")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.SCREEN_OFF")) 
      { 
//logout logic 
} 

else if(action.equalsIgnoreCase("android.intent.action.DIAL")) 
      { 
//logout logic 
} 
else if(action.equalsIgnoreCase("android.intent.action.CALL")){ 
/ /logout logic 
} 
} 
+0

我喜歡這裏的思想,但有活動進入背景的其他方式 - 例如另一項活動將自己帶到前臺。 –

3

我通過在活動關閉\暫停時存儲時間戳來處理它。當另一個活動開始時,它讀取時間戳,如果它變化超過x秒,我執行註銷。

如果您需要物理執行註銷(即在遠程服務器上),請在活動暫停以在將來註銷x秒時設置AlarmManager。如果在火災發生之前開始另一項活動,您可以取消該警報。

+0

在您的活動中添加TimeStamp的想法非常棒! –

0

android:clearTaskOnLaunch可能是有幫助的。當您轉到後臺時,它不會將您註銷,但您可以在剛返回時強制登錄屏幕成爲第一個。

相關問題