2011-11-21 122 views
1

我在我的應用程序中有一個密碼鎖。用戶可以在設置中保存密碼,並選擇僅允許用戶使用密碼進入應用程序。當應用程序啓動時,用戶會看到一個啓動畫面。在此活動中,如果用戶選擇在設置中啓用密碼鎖定,則會出現一個要求輸入密碼的對話框。Android:實現應用程序鎖定屏幕的意圖設置

要確保誰願意鎖定每次他們嘗試使用應用時,呈現該屏幕應用程序的用戶,我已經設置:

android:clearTaskOnLaunch="true" 
在清單

對於此活動,這是啓動/我的應用程序的主要活動。有趣的是,它不會讓其他用戶多任務(沒有選擇鎖定應用程序的用戶)離開,並返回他們離開的地方。如果他們通過這項活動進入應用程序。但是,如果他們通過不同的活動(我有一個可以播放幾種不同意圖的小部件)進入應用程序,那麼用戶可以多任務處理,然後回到他們離開的應用程序(直到他們完全返回使用後退按鈕退出應用程序)。

有沒有辦法在這裏獲得兩套功能?對於想要密碼鎖定的用戶,我是否可以讓應用始終打開密碼鎖屏啓動畫面,並且擁有良好的多任務處理功能,而不會妨礙其他用戶加載應用的方式?

回答

0

除了使用clearTaskOnLaunch之外,還可以在每個活動的「onStart」中放置一個條件語句。

例子:

if (pref.getBoolean("requiresPassword", false)){ 
    startActivity(new Intent(context, SplashScreen.class)); 
} 

爲了使代碼更便攜,更容易在每一個活動的地方,我創建了一個包含若干方法中的一種單級,因此,例如:

public class M { 
    public static void check(final Context context){ 
     //do the shared prefs getting and startActivity from here. 
    } 
} 

然後在你的onStartActivity,你只需要做的就是M.check(this);

編輯:

作爲Scienceprodigy,上述將導致無限循環。我沒有想到這一點。

我實際上做的是創建一個對話框彈出要求輸入密碼,就像這樣:

public static void requestPassword(final Context context){ 
     final SharedPreferences pref = PreferenceManager.getDefaultSharedPreferences(context); 
     final Activity activity = (Activity)context; 
     boolean requestPassword = pref.getBoolean("appLock", false); 
//  Log.i(tag, String.valueOf(requestPassword)); 
     if (!requestPassword){ 
      return; 
     } 

     final EditText myPass2 = new EditText(context); 

      new AlertDialog.Builder(context) 
      .setTitle("Enter Password") 
      .setView(myPass2) 
      .setPositiveButton("OK", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        String secPass = pref.getString("secPassword", "password"); 
        String entPass = myPass2.getText().toString(); 
        if (entPass.equals(secPass)){ 
         myPass2.setText(""); 
         saveTime(context); 
        } else { 
         Toast.makeText((Activity)context, "Incorrect Password", Toast.LENGTH_SHORT).show(); 
         myPass2.setText(""); 
         activity.finish(); 
        } 
       } 
      }) 
      .setNegativeButton("Cancel", new DialogInterface.OnClickListener() { 

       @Override 
       public void onClick(DialogInterface arg0, int arg1) { 
        myPass2.setText(""); 
        activity.finish(); 
       } 
      }) 
      .setCancelable(true) 
      .setOnCancelListener(new DialogInterface.OnCancelListener() { 

       @Override 
       public void onCancel(DialogInterface arg0) { 
        myPass2.setText(""); 
        activity.finish(); 
       } 
      }) 
      .show(); 
     } 
+0

這將創建一個口令檢查的無限循環,輸入密碼,然後密碼檢查等 –

+0

@Scienceprodigy我更新了我的答案,使用AlertDialog,而不是啓動的閃屏。這可能不完全是你想要的,但從用戶的角度來看,如果嘗試多任務,我更喜歡一個對話框。這似乎更容易。當然,如果更適合你,你可以使用用XML定義的自定義佈局。 – Jakar

0

這可能會爲你工作:

  1. 子類的活動類,所以你有2個空內部類:

    public class MyActivity { 
    
        public static class Locked extends MyActivity { 
        } 
    
        public static class NoLock extends MyActivity { 
        } 
    
        // ... 
    
    } 
    
  2. 修改清單以指向內部cl驢,一個與clearTaskOnLaunch標誌設置爲true,另一套爲false:

    <!-- original activity --> 
    <activity android:name="MyActivity$Locked" 
        android:clearTaskOnLaunch="true" > 
        <!-- other flags and elements ... --> 
    </activity> 
    
    <!-- unlocked activity --> 
    <activity android:name="MyActivity$NoLock" 
        android:clearTaskOnLaunch="false" > 
        <!-- other flags and elements ... --> 
    </activity> 
    
  3. 修改您的小部件代碼來啓動或者基於用戶是否已啓用應用程序密碼鎖或不MyActivity.LockedMyActivity.NoLock

  4. 如果之前從啓動器啓動了活動(其清單條目中有<category android:name="android.intent.category.LAUNCHER" />),則可能需要創建一個簡單的「歡迎」活動來替換它,這將需要決定在哪個版本的MyActivity中啓動onCreate()方法,是這樣的:

    public class Welcome extends Activity { 
    
        @Override 
        public void onCreate(Bundle icicle) { 
         super.onCreate(icicle); 
    
         if (mPasswordLocked) { 
          startActivity(new Intent(this, MyActivity.Locked.class)); 
         } else { 
          startActivity(new Intent(this, MyActivity.NoLock.class)); 
         } 
    
         finish(); 
        } 
    
    
    } 
    
+0

這看起來像一個有前途的解決方案,但它將如何解決從家裏啓動應用程序? –

+0

添加了步驟#4來解決啓動器活動。 – Joe

相關問題