2011-11-21 4 views
1

내 앱에 비밀번호 잠금이 있습니다. 사용자는 설정에 암호를 저장할 수 있으며 암호가있는 응용 프로그램에만 사용자를 허용하도록 선택할 수 있습니다. 앱이 시작되면 사용자에게 스플래시 화면이 표시됩니다. 이 활동에서 사용자가 설정에서 암호 잠금을 사용하도록 선택한 경우 암호를 묻는 대화 상자를 표시합니다. Android : 애플리케이션 잠금 화면 구현을위한 의도 설정

이 화면과 함께 그들이 응용 프로그램을 사용하려고 할 때마다 제시 잠금 응용 프로그램을 원하는 사용자, 내가 설정했는지 확인하십시오 : 매니페스트에

android:clearTaskOnLaunch="true" 

을하다이 활동을 위해 내 애플 리케이션의 시작/주요 활동. 다른 사용자가 멀티 태스킹 (앱을 잠그기로 선택하지 않은 사용자)을 떠나지 못하게하고, 중단 한 곳으로 되돌아 오지 못하도록하는 것입니다. IF 및이 활동을 통해 앱에 들어온 경우에만 해당됩니다. 그러나 다른 액티비티 (다른 인 텐트를 브로드 캐스팅하는 위젯이 있음)를 통해 앱에 들어가면 사용자는 멀티 태스킹을 수행하고 중단 한 부분의 앱으로 되돌아 갈 수 있습니다 (실제로 되돌릴 때까지). 다시 버튼을 사용하여 응용 프로그램 밖으로).

여기에 두 가지 기능을 모두 사용할 수있는 방법이 있습니까? 비밀번호 잠금을 원하는 사용자가 앱을 항상 비밀번호 잠금 시작 화면에 열어 둘 수 있고 다른 사용자가 앱을로드하는 방법을 망치지 않고도 멀티 태스킹을 할 수 있습니까?

답변

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. 
    } 
} 

모든 Activity에 대해 onStart에서 M.check(this);

편집 :

Scienceprodigy 마찬가지로 위의 infinte 루프가 발생합니다. 나는 그런 생각을하지 않았다.

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

나는를 시작 대신에 AlertDialog를 사용하는 내 대답을 업데이트 @Scienceprodigy 스플래시 화면. 이것은 정확히 원하는 것일 수는 없지만 사용자 입장에서는 다중 작업을 시도 할 때 대화를 선호합니다. 그것은 더 쉬운 것처럼 보인다. 물론 더 잘 맞는 경우 XML로 정의 된 사용자 정의 레이아웃을 사용할 수 있습니다. – Jakar

0

이 당신을 위해 작동 할 수 있습니다 :

는 내가 뭘 실제로 것은이 같은 암호를 묻는 대화 상자 팝업을 만드는 것입니다

  1. 서브 클래스의 활동 클래스는 빈 2 그래서 내부 클래스 :

    public class MyActivity { 
    
        public static class Locked extends MyActivity { 
        } 
    
        public static class NoLock extends MyActivity { 
        } 
    
        // ... 
    
    } 
    
  2. 내부 클레임을 가리 키도록 매니페스트를 수정하십시오. 엉덩이는 clearTaskOnLaunch 플래그 하나는 거짓으로 사실과 다른 설정으로 설정 :

    <!-- 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.Locked 또는 MyActivity.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

Launcher 작업을 처리하기 위해 4 단계가 추가되었습니다. – Joe

관련 문제