【问题标题】:Android: Intent setup for implementing application lock screenAndroid:实现应用程序锁屏的意图设置
【发布时间】:2011-11-21 00:19:36
【问题描述】:

我的应用中有密码锁。用户可以在设置中保存密码,并选择只允许用户使用密码进入应用程序。当应用程序启动时,用户会看到一个启动画面。在这个 Activity 中,如果用户选择在设置中启用密码锁定,我会显示一个询问密码的对话框。

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

android:clearTaskOnLaunch="true"

在此活动的清单中,这是我的应用程序的启动/主要活动。令人讨厌的是,它不会让其他用户(没有选择锁定应用程序的用户)多任务处理,然后从他们离开的地方返回。如果且仅当他们通过此活动进入应用程序时。但是,如果他们通过不同的 Activity 进入应用程序(我有一个广播几个不同 Intent 的小部件),那么用户可以进行多任务处理,然后回到他们离开的应用程序(直到他们真正返回使用后退按钮退出应用程序)。

有没有办法在这里获得两组功能?我可以让应用程序始终为想要密码锁定的用户打开密码锁定闪屏,并且具有良好的多任务处理能力,而不会影响应用程序为其他用户加载的方式吗?

【问题讨论】:

    标签: android android-intent password-protection


    【解决方案1】:

    这可能对你有用:

    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. 如果 Activity 之前是从 Launcher 启动的(在其清单条目中有 &lt;category android:name="android.intent.category.LAUNCHER" /&gt;),您可能需要创建一个简单的“欢迎”活动来替换它,这需要决定在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();
          }
      
      
      }
      

    【讨论】:

    • 这看起来是一个很有前途的解决方案,但是它将如何解决从 Home 启动应用程序的问题?
    • 添加了第 4 步以解决启动器活动。
    【解决方案2】:

    您可以在您拥有的每个 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,上述情况会导致无限循环。我没想到。

    我实际上要做的是创建一个对话框弹出窗口,要求输入如下密码:

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

    【讨论】:

    • 这将创建一个密码检查,输入密码,然后密码检查等的无限循环。
    • @Scienceprodigy 我更新了我的答案以使用 AlertDialog 而不是启动启动画面。这可能不是您想要的,但从用户的角度来看,如果尝试多任务,我更喜欢对话。这似乎更容易。当然,如果更适合您,您可以使用 XML 中定义的自定义布局。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-12
    • 2013-08-27
    • 1970-01-01
    • 2011-07-23
    相关资源
    最近更新 更多