2013-03-14 71 views
2

我正在嘗試構建一個應用程序,其中我在應用程序上應用了密碼。當用戶離開應用程序並再次打開時,我會要求輸入密碼。例如應用程序正在運行,用戶單擊主頁按鈕意味着離開應用程序,然後再打開它,應用程序將要求輸入密碼。如何在android中使用onResume活動

我在onResume()活動方法中創建密碼對話框。但問題是,如果用戶轉到下一個屏幕並返回到該屏幕,那麼onResume()將會執行並且將要求輸入密碼。但我不想要這個。我希望只有在他離開應用程序並重新來臨時纔會出現密碼提示。請告訴我任何解決方案,我應該在哪裏編寫該代碼。

+0

我預測這會讓你感覺有些困難。您正試圖強加一些Android無法識別或支持的應用程序生命週期概念。 「主頁」按鈕不會導致您「離開」應用程序。您的第一步將是明確表示「離開」應用程序的意義,Android條款。 – 2013-03-14 13:38:34

回答

1

試試看。

假設你有A,B活動,在A中創建一個靜態變量爲loggedIn = false;

現在假設你從B啓動B,onB onbackpress方法總是使loggedIn = true;

在活動上恢復方法檢查A的

如果(的loggedIn!){ showLogin對話框 } 然後重新分配真正 的loggedIn = TRUE;

現在如果用戶按主頁按鈕loggedIn標誌將是錯誤的,當恢復應用程序登錄對話框將被調用。

+0

不建議使用靜態變量。它可能導致內存泄漏。 – Raghunandan 2013-03-14 12:31:34

+0

可以請你告訴我,我將如何在onBackpress上實現它? – 2013-03-14 12:33:58

+0

在活動中寫公共靜態布爾loggedIn = false;沒有活動B @Override public void onBackPressed(){ \t A.loggedIn = true; \t super.onBackPressed(); }讓我知道它是否工作 – 2013-03-14 12:44:23

0

假設您有兩個活動(顯示對話框)和b。當您從一個活動a導航到另一個活動b。活動a進入後臺。活動b在前臺。都被放到活動的後臺。像LIFO(後進先出)一樣。當你點擊返回按鈕。活動b從後退堆棧中推出並顯示活動a。當活動暫停時,它必須恢復。當你的活動停止onStart()被調用,並在onResume on()被調用。所以如果你在onResume()中調用對話框,它會顯示出來。

看看下面的鏈接。

http://developer.android.com/training/basics/activity-lifecycle/index.html

http://developer.android.com/guide/components/tasks-and-back-stack.html

注意從上面的鏈接引用:一次可以在背景中保存多個任務。但是,如果用戶同時運行多個後臺任務,系統可能會開始銷燬後臺活動以恢復內存,從而導致活動狀態丟失。請參閱以下關於活動狀態的部分。

編輯

您必須實現onCreate()方法來執行應當對活動的整個生命只有一次發生的基本應用程序的啓動邏輯。所以在onCreate()而不是onResume()中顯示對話框。除非活動被破壞,否則不會再創造活動。

+0

我知道這一切。我正在尋求任何解決方案,我該如何做我想做的事情。 – 2013-03-14 12:17:49

+0

告訴我任何只有當用戶回到應用程序時纔會執行的事情。 – 2013-03-14 12:18:40

+0

檢查編輯。在oncreate中顯示對話框。 – Raghunandan 2013-03-14 12:22:18

0

您可以創建一個活動來處理認證過程並讓它調用它(A)。 ,讓你目前的活動是(B)和(C)。 所以,這是怎麼回事:

1-活動(一)是發射器。

2-在manifest.xml

3-從(A)添加到android:noHistory="true"活性(A)的標籤<activity>可以導航到(B)再到(C)。 (C)你可以回到(B),但是你將不能回到(A)。

0

時,home鍵被按下

@Override 

public boolean onKeyDown(int keyCode, KeyEvent event) { 

    if(keyCode == KeyEvent.KEYCODE_HOME) 
    { 
    fromHome = true; 
    } 

return false; 
}; 

,並設置變量假可以設置變量,當你從這個活動

fromHome = false; 

導航和OnResume()

+0

嘿,這隻適用於舊版本的Android,即在Android GB不是android ICS和果凍豆 – 2013-03-14 12:40:19

0

這似乎檢查標誌我實際上試圖跟蹤的是你的應用程序中「已啓動」活動的數量:#(已開始的活動)> 0意味着你的應用程序on沒有被置於後臺,因爲如果用戶按Home,所有你的應用程序的活動都會被調用onStop()。

爲了追蹤「入門」活動的數量,你可以引進像這樣一個單:

public class LifecycleTracker { 

private LifecycleTracker mInstance; 

private int mNrOfStarted; 

private LifecycleTracker() { 
    mNrOfStarted = 0; 
} 

public static LifecycleTracker getInstance() { 
    if (mInstance == null) { 
     mInstance = new LifecycleTracker(); 
    } 
    return mInstance; 
} 

public void incrementStarted() { 
    mNrOfStarted++; 
} 

public void decrementStarted() { 
    mNrOfStarted--; 
} 

public boolean fromBackground() { 
    return mNrOfStarted == 0; 
} 
} 

然後,在您的所有活動的在onStart()方法,你應該首先檢查您是否到來從背景:

if (LifecycleTracker.getInstance().fromBackground()) { 
    //start authentication 
    //don't forget to increment after authentication as well! 
} else { 
    LifecycleTracker.getInstance().incrementStarted(); 
} 

而且在所有活動的的onStop()方法,你應該減:

LifecycleTracker.getInstance()decrementStarted。 ();

相關問題