Android: намеренная настройка для реализации экрана блокировки приложения - PullRequest
1 голос
/ 21 ноября 2011

У меня есть блокировка паролем в моем приложении.Пользователь может сохранить пароль в настройках и разрешить вход в приложение только пользователю с паролем.Когда приложение запускается, пользователю предоставляется заставка.В этом упражнении, если пользователь решил включить блокировку паролем в настройках, я представляю диалоговое окно, запрашивающее пароль.

Чтобы убедиться, что пользователю, который хочет заблокировать приложение, предоставляется этот экран каждый развремя, когда они пытаются использовать приложение, я установил:

android:clearTaskOnLaunch="true"

в манифесте для этого действия, которое является запуском / основным действием моего приложения.Отвратительно, что это не позволяет другим пользователям выполнять многозадачность (пользователям, которые не решили заблокировать приложение) и возвращаться с того места, где они остановились.Если и только если они вошли в приложение через это действие.Однако, если они входят в приложение через другую активность (у меня есть виджет, который передает несколько разных интентов), то пользователь может выполнить многозадачность и вернуться в приложение, где он остановился (до тех пор, пока он фактически не вернется полностью).из приложения с помощью кнопки «Назад».

Есть ли способ получить оба набора функций здесь?Могу ли я иметь приложение всегда открытым на заставке блокировки пароля для пользователей, которые хотят заблокировать пароль, и имеют хорошую многозадачность, не беспокоясь о том, как приложение загружается для других пользователей?

Ответы [ 2 ]

0 голосов
/ 21 ноября 2011

Это может работать для вас:

  1. Подкласс вашего класса деятельности, так что у вас есть 2 пустых внутренних класса:

    public class MyActivity {
    
        public static class Locked extends MyActivity {
        }
    
        public static class NoLock extends MyActivity {
        }
    
        // ...
    
    }
    
  2. Изменитьманифест, указывающий на внутренние классы, один с флагом 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.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 голосов
/ 21 ноября 2011

Вместо использования 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.
   }
}

А затем в вашем onStart для каждого Activity, все выМне нужно было бы сделать это M.check(this);

РЕДАКТИРОВАТЬ:

Как и Scienceprodigy, вышеприведенное вызовет цикл infinte.Я не думал об этом.

Что бы я на самом деле сделал, это создал бы всплывающее окно Dialog, запрашивающее пароль, например:

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();
        }
...