首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Android:实现应用程序锁定屏幕的意图设置

Android:实现应用程序锁定屏幕的意图设置
EN

Stack Overflow用户
提问于 2011-11-21 00:19:36
回答 2查看 1.8K关注 0票数 1

我的应用程序中有一个密码锁。用户可以在设置中保存密码,并选择只允许用户使用密码进入应用程序。当应用程序启动时,用户会看到一个飞溅的屏幕。在此活动中,如果用户选择启用设置中的密码锁定,我将显示一个请求密码的对话框。

为了确保每当用户尝试使用该应用程序时,都会显示该应用程序被锁定的用户的屏幕,我设置:

代码语言:javascript
运行
复制
android:clearTaskOnLaunch="true"

在这个活动的清单中,这是我的应用程序的启动/主要活动。最糟糕的是,它不会让其他用户多任务(没有选择锁定应用程序的用户)离开,而是回到原来的位置。如果和只有当他们已经通过这个活动进入应用程序。但是,如果他们是通过不同的活动进入应用程序的(我有一个小部件可以广播几个不同的意图),那么用户可以多任务,然后回到他们停下来的应用程序中(直到他们使用后退按钮返回应用程序)。

有办法在这里获得这两套功能吗?对于那些想要密码锁的用户,我可以让这个应用始终打开密码锁启动屏幕,并且有良好的多任务处理而不影响其他用户的加载方式吗?

EN

回答 2

Stack Overflow用户

发布于 2011-11-21 00:52:20

不使用clearTaskOnLaunch,您可以在每个活动的'onStart‘中添加一个条件语句。

示例:

代码语言:javascript
运行
复制
if (pref.getBoolean("requiresPassword", false)){
    startActivity(new Intent(context, SplashScreen.class));
}

为了使代码更易于移植并更容易在每个活动中放置,我创建了一个包含多个方法的类,例如:

代码语言:javascript
运行
复制
public class M {
   public static void check(final Context context){
       //do the shared prefs getting and startActivity from here.
   }
}

然后在你的onStart中,每一个Activity,你要做的就是M.check(this);

编辑:

作为科学神童,上述因素将导致无穷大的循环。我没想过这个。

我实际上要做的是创建一个对话框弹出请求密码,如下所示:

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2011-11-21 01:37:36

这可能对你有用:

  1. 子类是您的活动类,因此您有两个空的内部类:

公共类MyActivity {公共静态类锁定扩展MyActivity {}公共静态类NoLock MyActivity {} // .}

  • 修改清单以指向内部类,其中一个类的clearTaskOnLaunch标志设置为真,另一个类设置为false:

  • 根据用户是否启用了应用程序密码锁,修改小部件代码以启动MyActivity.LockedMyActivity.NoLock。如果活动以前是从启动程序(在清单条目中有

  • )启动的,您可能需要创建一个简单的“欢迎”活动来替换它,它需要决定在onCreate()方法中启动哪个版本的MyActivity,如下所示:

公共类欢迎扩展活动{ @Override void onCreate(Bundle冰柱){super.onCreate(冰柱);if (mPasswordLocked) {startActivity(新意图(this,MyActivity.Locked.class));}startActivity(新意图(this,MyActivity.NoLock.class));} finish();}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8205965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档