Android:用于实现应用程序锁定屏幕的Intent设置

时间:2011-11-21 00:19:37

标签: android android-intent password-protection

我的应用中有密码锁定。用户可以在设置中保存密码,并选择仅允许用户使用密码进入应用程序。当应用程序启动时,会向用户显示启动画面。在此活动中,如果用户已选择在设置中启用密码锁定,则会显示一个要求输入密码的对话框。

为了确保每次尝试使用该应用时,想要锁定应用的用户都会看到此屏幕,我已设置:

android:clearTaskOnLaunch="true"

在此活动的清单中,这是我的应用的启动/主要活动。令人不快的是,它不会让其他用户多任务(没有选择锁定应用程序的用户)离开,然后回到他们中断的地方。仅当他们通过此活动进入应用程序时。但是,如果他们通过一个不同的Activity进入应用程序(我有一个播放几个不同意图的小部件),那么用户可以多任务,然后回到他们中断的应用程序(直到他们实际上一直回到使用后退按钮退出应用程序。)

有没有办法在这里获得这两套功能?对于想要密码锁定的用户,我是否可以始终打开密码锁定启动画面,并且在不弄乱应用程序如何加载其他用户的情况下进行良好的多任务处理?

2 个答案:

答案 0 :(得分:0)

您可以在每个Activity的'onStart'中添加条件语句,而不是使用clearTaskOnLaunch

示例:

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

为了使代码更容易在每个Activity中放置,我创建了一个包含多个方法的单个类,例如:

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

答案 1 :(得分:0)

这可能对您有用:

  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.LockedMyActivity.NoLock

  4. 如果活动先前是从Launcher启动的(在其清单条目中有<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();
        }
    
    
    }