2016-05-18 27 views
0

我有使用自動鎖定(需要密碼輸入畫面)的應用程序...將密碼畫面添加到設備睡眠時重新鎖定的應用程序中?

a) when the app starts for the first time 
b) when another app is started and takes over the device 
c) when the device "sleeps" automatically 
d) when the user "sleeps" the device manually 
(note: with c & d, if the user "awakens" the app within 5 seconds, it does NOT ask for the password) 

我想對,所以我創建了一個活動,我寫以及一個應用程序做到這一點( PasswordActivity)進行必要的驗證步驟,並使其正常工作。

我原來把它放在MainActivityONCREATE(這是在AndroidManifest中發射的)。這似乎很好。但隨後開始重新鎖定能力。所以試着將它移動到ONSTARTONRESUME。但是當我的應用程序中的另一個活動聚焦或屏幕旋轉時,PasswordActivity再次發射。這是行不通的。

在這裏我發現了一個線程推薦使其成爲清單中的LAUNCHER應用程序,然後在密碼正常時調用MainActivity。這似乎工作得更好......但後來遇到了一個問題,只有當用戶按下主屏幕後退按鈕(我假設停止我的應用程序)並再次啓動應用程序時,它纔會「重新鎖定」。儘管如此,不會抓住另一個APP來接管設備。

因此,基於這一點以及在查看所有可以在生命週期中找到的文檔(儘管大部分文檔都是基於ACTIVITY的,而不是基於APPLICATION的),但當APP本身失去焦點時(另一個應用接管)以及如何處理自動或手動睡眠(上面的C &)以及延時檢查。我假設這將是幾個呼叫或步驟的組合,但不確定在這一點上究竟是哪一個。

有什麼建議嗎?

+0

我認爲,當你的應用程序在背景上(失去焦點),函數'onPause'被執行。這就是你要求的? – UDKOX

+0

'OnPause'從我所知道的(並且已經在線閱讀了關於LIFECYCLES的消息,當一個活動失去焦點時...不一定是APP本身。如果我試圖在'onPause'中捕獲它,當另一個活動在我的內部 – Peter

+0

難道你不能只檢查另一個Activity是否有焦點嗎?例如:'public void onPause(){if(!hasAnotherActivityFocus()){lockPassword();}}' – UDKOX

回答

0

我想我想通了一些建議以及一些研究。我在這裏發佈我的解決方案以防萬一它可以幫助別人,有人看到我沒有看到或遇到的一個明確的缺陷,或者有人有其他的輸入可以改善它。

如前所述,我所知道的最大問題是沒有任何內置的函數調用可以確定何時「你的應用程序」不在前臺。 和onResume是基於活動的,而不是基於應用程序的......因此,您的應用程序中的活動更改爲活動,甚至屏幕旋轉也會觸發它們。

爲了解決這個問題......我創建了一個名爲gv.appPauseTime的全局變量。我創建了兩個獨立的通用實用函數,可以從我的應用程序的任何位置調用。

public static void lockAppStoreTime() { 
    gv.appPauseTime=new Date(); 
} 

public static void lockAppCheck(Activity act) { 
    boolean bLock=false; 

    // Check to see if this is the first time through app  
    if (gv.appPauseTime==null) { 
     bLock = true; 
    } else { 
     Date currTime = new Date(); 
     long diffMillis = currTime.getTime() - gv.appPauseTime.getTime(); 
     long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffMillis); 

     // Lock app if 120 seconds (2 minutes) has lapsed 
     if (diffInSec > 120) { 
      bLock=true; 
     } 
    } 

    gv.appLastPause = new Date(); 
    if (bLock) { 
     Intent j = new Intent(act, PasswordActivity.class); 
     act.startActivity(j); 
    } 
} 

在每一個活動,我創建(或修改)的和onResume是這樣的...

@Override 
public void onPause(){ 
    super.onPause(); 
    Util.lockAppStoreTime(); 
} 

@Override 
public void onResume(){ 
    super.onResume(); 
    Util.lockAppCheck(this); 
} 

當火災,它存儲了當前日期(時間)。當onResume在任何函數中觸發時,它會將當前日期(時間)與存儲的日期(時間)進行比較。如果120秒(2分鐘)已過,則顯示PasswordActivity以驗證密碼。它在調用PasswordActivity之前「存儲」當前日期(時間),以便它不會重複迭代它。基本上,如果在一個活動暫停和任何活動之間存在2分鐘的差距,IN MY APP,恢復(或啓動),它會提示輸入密碼。如果用戶打開一個不同的APP,然後再次返回到我的APP ...,如果它至少需要2分鐘的時間,那麼請求輸入密碼。如果用戶關閉或關閉應用程序,則重新啓動也會觸發密碼。

我選擇了2分鐘,因爲在我們的應用程序中這似乎是一個體面的「時間流逝」。當然,這也可以改變。

到目前爲止,這麼好。希望這可以幫助其他人。