2014-01-07 28 views
1

我有一個問題的簡歷,如果有處理這種情況的體面的方式:密碼從背景

我想我的應用程序,以儘快啓動密碼活性,應用程序啓動了第一次或然後用戶恢復其(例如,用戶單擊主頁按鈕並將應用程序移到背景中,然後再次啓動它)。

我知道我可以使用特殊權限並授予對系統任務的訪問權限,但我不想這樣做。還有一些人會建議使用onPause,onResume和onStop - 製作一個布爾變量並將其狀態從true更改爲false。但是,只有當你有一個活動時,這纔有效 - 只要你從活動轉移到活動,你必須添加onActivityResult或處理布爾變量。

所以也許你可以建議更多的東西?

更新:

這是從我的應用程序主要活動示例代碼:

@Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
    if (getIntent().getAction() != null && getIntent().getAction().equals(Intent.ACTION_MAIN) && savedInstanceState == null) { 
     requestPinCode(); 
     } 
/* .. */ 
} 

private void requestPinCode() { 
    boolean pinStart = false; 
    SharedPreferences appPrefs = PreferenceManager.getDefaultSharedPreferences(getApplicationContext()); 
    pinStart = appPrefs.getBoolean("switch_pincode", false); 
    if (pinStart) { 
     Intent intent = new Intent(this, PinCodeActivity.class); 
     startActivity(intent); 
    } 
} 

如果pinStart是真實的 - 這意味着鎖被激活,用戶必須在應用程序開始輸入密碼。但是,如果您只是單擊主頁按鈕並再次啓動應用程序,則不會詢問密碼。如何處理這個?我想在用戶輸入應用程序時立即啓動密碼活動,但是當他在應用程序內導航時 - 無密碼。我也想在每個活動中都有這個,不僅在主體中。

+0

您是否正在嘗試製作另一個僅適用於您的應用而不是整個手機的屏幕鎖? – VM4

+0

你可以存儲布爾值優先 – Hardik

+0

nope,我想只有我的應用程序屏幕鎖。它是應用程序的一部分,僅用於某些數據保護。 – tereru

回答

2

您可以將您的布爾值存儲在shared preferences ,即使您切換活動,它仍然保留在內存中。 例如:當你想解鎖你的應用程序(例如在的onStop()),你可以將它設置爲false,用這種方法:

public void setLockStatus(boolean lock) { 
    getSharedPreferences("SOMETAG", 0).edit().putBoolean("LOCK", lock) 
     .commit(); 
} 

後來,當你要檢查,如果您的應用程序被鎖定(也許在明年的活動在onStart):

public boolean getLockStatus() { 
    return getSharedPreferences("SOMETAG", 0).getBoolean("LOCK", true); 
} 

還要注意的是,如果沒有「LOCK」值已設置此方法將返回true(第二參數去getBoolean所示)。

因此,每當您開始時的活動檢查我們的國旗,如果該應用程序被鎖定。

@Override 
public void onStart() { 
    super.onStart(); 
    if (getLockStatus() == true) { 
     // show lockscreen 
    } else { 
     // we are not locked. 
    } 
} 

現在,我們還需要一個標誌,檢查是否我們仍然在App並沒有離開:

public void setAppStatus(boolean status) { 
    getSharedPreferences("SOMETAG", 0).edit().putBoolean("IN_APP", status) 
     .commit(); 
} 
public boolean getAppStatus() { 
    return getSharedPreferences("SOMETAG", 0).getBoolean("IN_APP", false); 
} 

所以,現在我們每次推出新的活動時間,然後纔開始它,我們必須設置我們仍然在應用程序中的標誌,以便onStop知道我們不應該鎖定應用程序。如果我們需要鎖定

@Override 
    public void onClick(View v) { 
     setAppStatus(true); // we are not leaving the app. 
     // startActivity(blabla);  
    } 

現在的onStop檢查:

@Override 
    public void onStop() { 
     super.onStop(); 
     if(getAppStatus() == false) setLockStatus(true); // locking the app 
     else setLockStatus(false); 
    } 

編輯:還需要setAppStatus 例如,如果您的按鈕的onClick在onclick開始新的活動,我們可以做到這一點(假);如果你真的離開了應用程序。

希望這可以讓你知道如何解決它,你需要自己實現背按邏輯(何時鎖定應用程序,何時不鎖定)。

+0

好吧然後如何處理這種情況:應用程序有一個鎖,用戶啓動顯示密碼活動的第一項活動。用戶輸入密碼並返回到第一個活動。但第一項活動是onStop,因爲密碼活動處於最佳狀態。這是一個循環:) – tereru

+0

然後你還需要一個標誌,當你startActivity()或者回退(並保持在應用程序),這表明你永遠不會離開應用程序時獲取設置。因此,例如,如果您的活動週期是A - > B - > C,則當您在B時按下後會設置一個標誌,表示您仍然在App中,並且不需要鎖定onStop()。 – VM4

+0

這就是我正在尋找 - 如何設置這些標誌和在哪裏:)) – tereru

1

通過實現您自己的應用程序對象,您可以在活動之間維護一些常見狀態。

創建擴展Application像這樣一類:

public class MyApplication extends Application { 
    boolean userIsLoggedIn; 

    public boolean isUserLoggedIn() { 
     return userIsLoggedIn; 
    } 

    public void setUserIsLoggedIn(boolean loggedIn) { 
     userIsLoggedIn = loggedIn; 
    } 
} 

然後使用它作爲清單文件的應用程序:

<application ... ... android:name="MyApplication"> 

然後在你的活動,你得到的應用對象是這樣的:

@Override 
public void onStart() { 
    MyApplication myApp = (MyApplication)getApplication(); 
    boolean isLoggedIn = myApp.isUserLoggedIn(); 
    if (!isLoggedIn) { 
     // .. open login activity 
    } 
} 
+0

請多描述一下如何檢查用戶是否來自應用內的其他活動,或者他是否從後臺重新啓動應用?這是一個我關心的問題,而不是如何重用另一個類來檢查記錄狀態。 – tereru

+0

我已經採納了你的建議,但結合VM's :)謝謝 – tereru