2012-09-19 39 views
9
實現密碼鎖

我的應用程序有敏感的用戶信息,我們需要實現一個密碼屏幕,每當用戶打開的應用程序來顯示。 這裏是我讀this post後嘗試了兩種方法。爲Android應用程序

  1. 使用一個靜態變量,並在每個活動的onStop()復位,並在每個活動的onStart()再次檢查並顯示密碼屏幕如果時間跨越了最低門限說1-2秒。這種方法的問題是,我的應用程序還使用意圖調用相機和條形碼掃描儀和用戶可以在這些外部應用花費更長的時間。在這種情況下,我可以增加閾值,但它會使計算變得複雜,不是一個很好的解決方案。

  2. 我試過使用這種方法的另一種方法。

    protected boolean isAppOnForeground(final Context context) { 
    List<RunningAppProcessInfo> appProcesses = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getRunningAppProcesses(); 
    
        if (appProcesses == null) { 
         return false; 
        } 
    
        final String packageName = context.getPackageName(); 
    
        for (RunningAppProcessInfo appProcess : appProcesses) { 
         if ((appProcess.importance == RunningAppProcessInfo.IMPORTANCE_FOREGROUND) && 
          appProcess.processName.equals(packageName)) { 
          return true; 
         } 
        } 
        return false; 
    } 
    

但是當我既然已經通過它在調用onStart

時間啓動的過程中每個活動的OnStart方法檢查它這將始終返回true是否有任何其他的辦法,當用戶打開應用程序時,我可以採取顯示密碼?即使用戶單擊主屏幕以退出應用程序,然後從最近的應用程序返回到應用程序,也應該顯示它。

+0

不知道,但如果ü可以做一個服務,每說1或2秒致電isapponforeground和變量更改爲真/假,並在簡歷的活動,只需檢查真/假 – Amit

+0

對於#1,什麼關於存儲在* private * SharedPreference中的加密的ONE TIME USE會話/ cookie類型字符串 - 您可以將超時設置爲幾分鐘,這可以允許用戶離開並返回到您的應用程序。 – pjco

+0

另一種可能的解決方案是成爲設備管理員使用設備鎖而不是自定義應用程序鎖定。這可能會更好或更糟,具體取決於你如何看待它。如果您有很多需要安全性的應用程序,那麼對於所有應用程序而言都是單一鎖定。如果你只有一個應用程序,用戶會因爲你的應用程序迫使他們鎖定屏幕而感到惱火。 –

回答

4

我實現了這個確切的功能。我基本上做了你的#1,但以一種更清潔的方式。

我所做的是編寫一個抽象子類Activity,並覆蓋onResume()。在那裏,決定是否需要顯示引腳鎖定屏幕。如果你這樣做,完成自己並開始引腳鎖定活動。讓您的所有活動延伸此活動。要記住您所在的位置,您可以爲用於啓動引腳鎖定活動的意圖添加一個「開始意圖」額外的內容。當應用程序解鎖時,鎖定活動可以使用該額外功能將用戶放回原位。

如果您的應用程序是基於片段,這將是簡單的。只要恢復承載所有碎片的活動,就會顯示引腳鎖定片段。就這樣。

由一系列活動組成的應用程序的問題是沒有明確的「啓動」應用程序的定義時刻。這個概念不存在。這實質上就是您在#1解決方案中發現的問題。 onResume()似乎是一個不錯的選擇,但可以被稱爲有許多原因。例如,用戶啓動活動A,它開始活動B.現在他們按回來。顯示引腳鎖定,還是不?

任何利用線程檢查前臺進程的解決方案是一個可怕的想法,因爲電池的影響。

最後,您可能想要質疑每次將應用程序置於前臺時鎖定PIN的要求。如果我跳出來閱讀短信並在10秒後回來,我似乎過分強迫我重新輸入密碼。時間基礎似乎更合適。

+0

'onResume()'與'onStart()'唯一的區別在於'onResume()'可以在對話框關閉後調用。我想這可能是一個優勢或劣勢。 – pjco

+0

@pjco我認爲'onStart/Stop()'可能是您確定的原因更好的選擇。 –

+0

@Jeff:謝謝。我實際上是在做一個BaseActivity,幾乎所有的Activity都是從這個BaseClass繼承而來的,並且我在onStart和onStop方法中實現了密碼檢查。當用戶打開對話框時,我不在乎這一點,因爲它們已經在應用程序中。我完全同意電池的影響,我絕對不會採取後臺服務的方式進行這項檢查。關於要求密碼,是的,這對我的應用程序非常重要。由於我沒有它,用戶實際上要求它並給出負面反饋。當然,我會讓它成爲誰的願望選擇。 – achie